feat: add db migration functionality for custom-data and kv store
closes #12825
This commit is contained in:
@@ -13,6 +13,8 @@ def start_convert_db(args: dict[str, Any]) -> None:
|
|||||||
|
|
||||||
from freqtrade.configuration.config_setup import setup_utils_configuration
|
from freqtrade.configuration.config_setup import setup_utils_configuration
|
||||||
from freqtrade.persistence import Order, Trade, init_db
|
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.migrations import set_sequence_ids
|
||||||
from freqtrade.persistence.pairlock import PairLock
|
from freqtrade.persistence.pairlock import PairLock
|
||||||
|
|
||||||
@@ -25,6 +27,8 @@ def start_convert_db(args: dict[str, Any]) -> None:
|
|||||||
|
|
||||||
trade_count = 0
|
trade_count = 0
|
||||||
pairlock_count = 0
|
pairlock_count = 0
|
||||||
|
kv_count = 0
|
||||||
|
custom_data_count = 0
|
||||||
for trade in Trade.get_trades():
|
for trade in Trade.get_trades():
|
||||||
trade_count += 1
|
trade_count += 1
|
||||||
make_transient(trade)
|
make_transient(trade)
|
||||||
@@ -41,16 +45,35 @@ def start_convert_db(args: dict[str, Any]) -> None:
|
|||||||
session_target.add(pairlock)
|
session_target.add(pairlock)
|
||||||
session_target.commit()
|
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
|
# Update sequences
|
||||||
max_trade_id = session_target.scalar(select(func.max(Trade.id)))
|
max_trade_id = session_target.scalar(select(func.max(Trade.id)))
|
||||||
max_order_id = session_target.scalar(select(func.max(Order.id)))
|
max_order_id = session_target.scalar(select(func.max(Order.id)))
|
||||||
max_pairlock_id = session_target.scalar(select(func.max(PairLock.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(
|
set_sequence_ids(
|
||||||
session_target.get_bind(),
|
session_target.get_bind(),
|
||||||
trade_id=max_trade_id,
|
trade_id=max_trade_id,
|
||||||
order_id=max_order_id,
|
order_id=max_order_id,
|
||||||
pairlock_id=max_pairlock_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."
|
||||||
|
)
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ def get_last_sequence_ids(engine, trade_back_name: str, order_back_name: str):
|
|||||||
return order_id, trade_id
|
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":
|
if engine.name == "postgresql":
|
||||||
with engine.begin() as connection:
|
with engine.begin() as connection:
|
||||||
if order_id:
|
if order_id:
|
||||||
@@ -59,6 +59,14 @@ def set_sequence_ids(engine, order_id, trade_id, pairlock_id=None):
|
|||||||
connection.execute(
|
connection.execute(
|
||||||
text(f"ALTER SEQUENCE pairlocks_id_seq RESTART WITH {pairlock_id}")
|
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):
|
def drop_index_on_table(engine, inspector, table_bak_name):
|
||||||
|
|||||||
Reference in New Issue
Block a user