11from typing import Any
22
3- from sqlalchemy import Text , event
3+ from sqlalchemy import Table , Column , Text , event , insert , select , update
4+ from sqlalchemy .schema import CreateTable
45
56from .database_backend_base import DatabaseBackend
67
@@ -10,6 +11,8 @@ class SQLiteBackend(DatabaseBackend):
1011
1112 temp_sequence_count = 0
1213
14+ select_stmt_for_sequence = None
15+
1316 def __init__ (self , database_connection_url = default_database_connection_url , force_recreate = False , ** kwargs : Any ):
1417 super ().__init__ (database_connection_url , force_recreate = force_recreate , ** kwargs )
1518
@@ -60,8 +63,35 @@ def array_allowed():
6063 def create_regex_constraint_clause (self , column_name , pattern ):
6164 return f"{ column_name } REGEXP { pattern } "
6265
63- @staticmethod
64- def next_id (data_sink ):
66+ def next_id (self , data_sink ):
6567 # hack, which is not reliable, must look for a better solution
66- SQLiteBackend .temp_sequence_count += 1
67- return SQLiteBackend .temp_sequence_count
68+ # SQLiteBackend.temp_sequence_count += 1
69+ # return SQLiteBackend.temp_sequence_count
70+ # ALWAYS CALL WITHIN A TRANSACTION?????
71+
72+ # better solution, but probably not best
73+ value = 0
74+ conn = self .database_connection .connect ()
75+ for row in conn .execute (self .select_stmt_for_sequence ):
76+ value = row [0 ]
77+ if value == 0 :
78+ stmt = insert (data_sink .sequence ).values ({"id" : 1 , "value" : 0 })
79+ conn = self .database_connection .connect ()
80+ conn .execute (stmt )
81+ conn .commit ()
82+ value += 1
83+ conn .execute (update (data_sink .sequence ).where (data_sink .sequence .c .id == 1 ).values ({"value" : value }))
84+ conn .commit ()
85+ return value
86+
87+ def create_sequence (self , metadata ):
88+ # need id column, so update has something to work with (see above)
89+ t = Table ("my_general_seq" ,
90+ metadata ,
91+ Column ("id" , SQLiteBackend .determine_sql_type_for_key_as_int ()),
92+ Column ("value" , SQLiteBackend .determine_sql_type_for_integer_property ()),
93+ schema = self .schema_for_core ())
94+ CreateTable (t ).compile (self .database_connection )
95+ self .select_stmt_for_sequence = select (t .c .value )
96+ return t
97+
0 commit comments