@@ -317,6 +317,31 @@ def migrate_pairlocks_table(decl_base, inspector, engine, pairlock_back_name: st
317317 set_sequence_ids (engine , pairlock_id = pairlock_id )
318318
319319
320+ def migrate_kv_store_table (decl_base , inspector , engine , kv_store_back_name : str , cols : list ):
321+ # Schema migration necessary
322+ with engine .begin () as connection :
323+ connection .execute (text (f'alter table "KeyValueStore" rename to "{ kv_store_back_name } "' ))
324+
325+ drop_index_on_table (engine , inspector , kv_store_back_name )
326+ kv_store_id = get_last_sequence_ids (engine , "KeyValueStore_id_seq" , kv_store_back_name )
327+
328+ # let SQLAlchemy create the schema as required
329+ decl_base .metadata .create_all (engine )
330+ # Copy data back - following the correct schema
331+ with engine .begin () as connection :
332+ connection .execute (
333+ text (
334+ f"""insert into "KeyValueStore"
335+ (id, key, value_type, string_value, datetime_value, float_value, int_value)
336+ select id, key, value_type, string_value, datetime_value, float_value, int_value
337+ from "{ kv_store_back_name } "
338+ """
339+ )
340+ )
341+
342+ set_sequence_ids (engine , kv_id = kv_store_id )
343+
344+
320345def set_sqlite_to_wal (engine ):
321346 if engine .name == "sqlite" and str (engine .url ) != "sqlite://" :
322347 # Set Mode to
@@ -387,12 +412,15 @@ def check_migrate(engine: Engine, decl_base, previous_tables: list[str]) -> None
387412 cols_trades = inspector .get_columns ("trades" )
388413 cols_orders = inspector .get_columns ("orders" )
389414 cols_pairlocks = inspector .get_columns ("pairlocks" )
415+ cols_kv_store = inspector .get_columns ("KeyValueStore" )
390416 tabs = get_table_names_for_table (inspector , "trades" )
391417 table_back_name = get_backup_name (tabs , "trades_bak" )
392418 order_tabs = get_table_names_for_table (inspector , "orders" )
393419 order_table_bak_name = get_backup_name (order_tabs , "orders_bak" )
394420 pairlock_tabs = get_table_names_for_table (inspector , "pairlocks" )
395421 pairlock_table_bak_name = get_backup_name (pairlock_tabs , "pairlocks_bak" )
422+ kv_store_tabs = get_table_names_for_table (inspector , "KeyValueStore" )
423+ kv_store_back_name = get_backup_name (kv_store_tabs , "KeyValueStore_bak" )
396424
397425 # Check if migration necessary
398426 # Migrates both trades and orders table!
@@ -423,6 +451,16 @@ def check_migrate(engine: Engine, decl_base, previous_tables: list[str]) -> None
423451 migrate_pairlocks_table (
424452 decl_base , inspector , engine , pairlock_table_bak_name , cols_pairlocks
425453 )
454+ if "KeyValueStore" in previous_tables :
455+ key_column = next (filter (lambda x : x ["name" ] == "key" , cols_kv_store ), None )
456+ # length of key column < 50, recreate table with correct length and migrate data
457+ if key_column and getattr (key_column ["type" ], "length" , - 1 ) < 50 :
458+ migrating = True
459+ logger .info (
460+ f"Running database migration for KeyValueStore - backup: { kv_store_back_name } "
461+ )
462+ migrate_kv_store_table (decl_base , inspector , engine , kv_store_back_name , cols_kv_store )
463+
426464 if "orders" not in previous_tables and "trades" in previous_tables :
427465 raise OperationalException (
428466 "Your database seems to be very old. "
0 commit comments