From 0888f6dba0734e9d39c1a6f03c993ac0da5e46ce Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 14 Feb 2026 15:49:27 +0100 Subject: [PATCH] feat: add db migration functionality for custom-data and kv store closes #12825 --- freqtrade/commands/db_commands.py | 25 ++++++++++++++++++++++++- freqtrade/persistence/migrations.py | 10 +++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/freqtrade/commands/db_commands.py b/freqtrade/commands/db_commands.py index 0d856e8a4..475c5050f 100644 --- a/freqtrade/commands/db_commands.py +++ b/freqtrade/commands/db_commands.py @@ -13,6 +13,8 @@ def start_convert_db(args: dict[str, Any]) -> None: from freqtrade.configuration.config_setup import setup_utils_configuration from freqtrade.persistence import Order, Trade, init_db + from freqtrade.persistence.custom_data import _CustomData + from freqtrade.persistence.key_value_store import _KeyValueStoreModel from freqtrade.persistence.migrations import set_sequence_ids from freqtrade.persistence.pairlock import PairLock @@ -25,6 +27,8 @@ def start_convert_db(args: dict[str, Any]) -> None: trade_count = 0 pairlock_count = 0 + kv_count = 0 + custom_data_count = 0 for trade in Trade.get_trades(): trade_count += 1 make_transient(trade) @@ -41,16 +45,35 @@ def start_convert_db(args: dict[str, Any]) -> None: session_target.add(pairlock) session_target.commit() + for kv in _KeyValueStoreModel.session.scalars(select(_KeyValueStoreModel)): + kv_count += 1 + make_transient(kv) + session_target.add(kv) + session_target.commit() + + for cd in _CustomData.session.scalars(select(_CustomData)): + custom_data_count += 1 + make_transient(cd) + session_target.add(cd) + session_target.commit() + # Update sequences max_trade_id = session_target.scalar(select(func.max(Trade.id))) max_order_id = session_target.scalar(select(func.max(Order.id))) max_pairlock_id = session_target.scalar(select(func.max(PairLock.id))) + max_kv_id = session_target.scalar(select(func.max(_KeyValueStoreModel.id))) + max_custom_data_id = session_target.scalar(select(func.max(_CustomData.id))) set_sequence_ids( session_target.get_bind(), trade_id=max_trade_id, order_id=max_order_id, pairlock_id=max_pairlock_id, + kv_id=max_kv_id, + custom_data_id=max_custom_data_id, ) - logger.info(f"Migrated {trade_count} Trades, and {pairlock_count} Pairlocks.") + logger.info( + f"Migrated {trade_count} Trades, {pairlock_count} Pairlocks, " + f"{kv_count} Key-Value pairs, and {custom_data_count} Custom Data entries." + ) diff --git a/freqtrade/persistence/migrations.py b/freqtrade/persistence/migrations.py index 59d717d57..2e5971c70 100644 --- a/freqtrade/persistence/migrations.py +++ b/freqtrade/persistence/migrations.py @@ -48,7 +48,7 @@ def get_last_sequence_ids(engine, trade_back_name: str, order_back_name: str): return order_id, trade_id -def set_sequence_ids(engine, order_id, trade_id, pairlock_id=None): +def set_sequence_ids(engine, order_id, trade_id, pairlock_id=None, kv_id=None, custom_data_id=None): if engine.name == "postgresql": with engine.begin() as connection: if order_id: @@ -59,6 +59,14 @@ def set_sequence_ids(engine, order_id, trade_id, pairlock_id=None): connection.execute( text(f"ALTER SEQUENCE pairlocks_id_seq RESTART WITH {pairlock_id}") ) + if kv_id: + connection.execute( + text(f'ALTER SEQUENCE "KeyValueStore_id_seq" RESTART WITH {kv_id}') + ) + if custom_data_id: + connection.execute( + text(f"ALTER SEQUENCE trade_custom_data_id_seq RESTART WITH {custom_data_id}") + ) def drop_index_on_table(engine, inspector, table_bak_name):