Skip to content

Commit 84535a1

Browse files
committed
chore: add migration path for kvstore
1 parent 832fb70 commit 84535a1

1 file changed

Lines changed: 38 additions & 0 deletions

File tree

freqtrade/persistence/migrations.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
320345
def 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

Comments
 (0)