From 9dfbe8cf63343ec5dfbb724cd59cb2d40ae90a51 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 21 Apr 2026 07:07:05 +0200 Subject: [PATCH] refactor: move db-migration to persistence --- freqtrade/commands/db_commands.py | 74 +----------------------- freqtrade/persistence/db_migration.py | 81 +++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 71 deletions(-) create mode 100644 freqtrade/persistence/db_migration.py diff --git a/freqtrade/commands/db_commands.py b/freqtrade/commands/db_commands.py index 3e20741ea..384af6e2f 100644 --- a/freqtrade/commands/db_commands.py +++ b/freqtrade/commands/db_commands.py @@ -8,16 +8,10 @@ logger = logging.getLogger(__name__) def start_convert_db(args: dict[str, Any]) -> None: - from sqlalchemy import func, select - from sqlalchemy.orm import make_transient 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 - from freqtrade.persistence.wallet_history import WalletHistory + from freqtrade.persistence import Trade, init_db + from freqtrade.persistence.db_migration import migrate_db config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) @@ -25,66 +19,4 @@ def start_convert_db(args: dict[str, Any]) -> None: session_target = Trade.session init_db(config["db_url_from"]) logger.info("Starting db migration.") - - trade_count = 0 - pairlock_count = 0 - kv_count = 0 - custom_data_count = 0 - wallet_history_count = 0 - for trade in Trade.get_trades(): - trade_count += 1 - make_transient(trade) - for o in trade.orders: - make_transient(o) - - session_target.add(trade) - - session_target.commit() - - for pairlock in PairLock.get_all_locks(): - pairlock_count += 1 - make_transient(pairlock) - 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() - - for wh in WalletHistory.session.scalars(select(WalletHistory)): - wallet_history_count += 1 - make_transient(wh) - session_target.add(wh) - 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))) - max_wallet_history_id = session_target.scalar(select(func.max(WalletHistory.id))) - - set_sequence_ids( - session_target.get_bind(), - trade_id=(max_trade_id or 0) + 1, - order_id=(max_order_id or 0) + 1, - pairlock_id=(max_pairlock_id or 0) + 1, - kv_id=(max_kv_id or 0) + 1, - custom_data_id=(max_custom_data_id or 0) + 1, - wallet_history_id=(max_wallet_history_id or 0) + 1, - ) - - logger.info( - f"Migrated {trade_count} Trades, {pairlock_count} Pairlocks, " - f"{kv_count} Key-Value pairs, {custom_data_count} Custom Data entries, " - f"and {wallet_history_count} Wallet History entries." - ) + migrate_db(session_target) diff --git a/freqtrade/persistence/db_migration.py b/freqtrade/persistence/db_migration.py new file mode 100644 index 000000000..9c535894c --- /dev/null +++ b/freqtrade/persistence/db_migration.py @@ -0,0 +1,81 @@ +import logging + +from sqlalchemy import func, select +from sqlalchemy.orm import make_transient + +from freqtrade.persistence.base import SessionType +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 +from freqtrade.persistence.trade_model import Order, Trade +from freqtrade.persistence.wallet_history import WalletHistory + + +logger = logging.getLogger(__name__) + + +def migrate_db(session_target: SessionType): + + trade_count = 0 + pairlock_count = 0 + kv_count = 0 + custom_data_count = 0 + wallet_history_count = 0 + for trade in Trade.get_trades(): + trade_count += 1 + make_transient(trade) + for o in trade.orders: + make_transient(o) + + session_target.add(trade) + + session_target.commit() + + for pairlock in PairLock.get_all_locks(): + pairlock_count += 1 + make_transient(pairlock) + 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() + + for wh in WalletHistory.session.scalars(select(WalletHistory)): + wallet_history_count += 1 + make_transient(wh) + session_target.add(wh) + 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))) + max_wallet_history_id = session_target.scalar(select(func.max(WalletHistory.id))) + + set_sequence_ids( + session_target.get_bind(), + trade_id=(max_trade_id or 0) + 1, + order_id=(max_order_id or 0) + 1, + pairlock_id=(max_pairlock_id or 0) + 1, + kv_id=(max_kv_id or 0) + 1, + custom_data_id=(max_custom_data_id or 0) + 1, + wallet_history_id=(max_wallet_history_id or 0) + 1, + ) + + logger.info( + f"Migrated {trade_count} Trades, {pairlock_count} Pairlocks, " + f"{kv_count} Key-Value pairs, {custom_data_count} Custom Data entries, " + f"and {wallet_history_count} Wallet History entries." + )