Fix migrations

This commit is contained in:
Matthias
2023-08-25 07:29:10 +02:00
parent 0181abc629
commit 5659ca2ecd
2 changed files with 40 additions and 30 deletions

View File

@@ -268,6 +268,13 @@ def set_sqlite_to_wal(engine):
def fix_old_dry_orders(engine):
with engine.begin() as connection:
# Update current dry-run Orders where
# - current Order is open
# - current Trade is closed
# - current Order trade_id not equal to current Trade.id
# - current Order not stoploss
stmt = update(Order).where(
Order.ft_is_open.is_(True),
tuple_(Order.ft_trade_id, Order.order_id).not_in(
@@ -281,36 +288,14 @@ def fix_old_dry_orders(engine):
).values(ft_is_open=False)
connection.execute(stmt)
# OLD
stmt = update(Order).where(
Order.ft_is_open.is_(True),
tuple_(Order.ft_trade_id, Order.order_id).not_in(
select(
Trade.id, Trade.open_order_id
).where(Trade.open_order_id.is_not(None))
),
Order.ft_order_side != 'stoploss',
Order.order_id.like('dry%')
).values(ft_is_open=False)
connection.execute(stmt)
# Update current Order where
# -current Order is open
# -current Order trade_id not equal to current Trade.id
# -current Order not stoploss
# -order_id not equal to current Trade.stoploss_order_id
# -current Order is dry
# NEW WIP
# Close dry-run orders for closed trades.
stmt = update(Order).where(
Order.ft_is_open.is_(True),
Order.ft_trade_id.not_in(
select(Trade.id).where(Trade.open_orders_count.is_not(0))
),
Order.order_id.not_in(
select(Trade.open_orders).filter(Order.order_id).first()
),
select(
Trade.id
).where(Trade.is_open.is_(True))
),
Order.ft_order_side != 'stoploss',
Order.order_id.like('dry%')
@@ -363,7 +348,7 @@ def check_migrate(engine, decl_base, previous_tables) -> None:
"start with a fresh database.")
set_sqlite_to_wal(engine)
# fix_old_dry_orders(engine) # TODO Fix that
fix_old_dry_orders(engine)
if migrating:
logger.info("Database migration finished.")

View File

@@ -15,6 +15,7 @@ from freqtrade.persistence import Trade, init_db
from freqtrade.persistence.base import ModelBase
from freqtrade.persistence.migrations import get_last_sequence_ids, set_sequence_ids
from freqtrade.persistence.models import PairLock
from freqtrade.persistence.trade_model import Order
from tests.conftest import log_has
@@ -217,6 +218,23 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
{amount},
0,
{amount * 0.00258580}
),
(
-- Order without reference trade
2,
'buy',
'ETC/BTC',
1,
'dry_buy_order55',
'canceled',
'ETC/BTC',
'limit',
'buy',
0.00258580,
{amount},
{amount},
0,
{amount * 0.00258580}
)
"""
engine = create_engine('sqlite://')
@@ -238,9 +256,10 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
# Run init to test migration
init_db(default_conf['db_url'])
trades = Trade.session.scalars(select(Trade).filter(Trade.id == 1)).all()
trades = Trade.session.scalars(select(Trade)).all()
assert len(trades) == 1
trade = trades[0]
assert trade.id == 1
assert trade.fee_open == fee.return_value
assert trade.fee_close == fee.return_value
assert trade.open_rate_requested is None
@@ -281,12 +300,18 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
assert orders[1].order_id == 'dry_buy_order22'
assert orders[1].ft_order_side == 'buy'
assert orders[1].ft_is_open is False
assert orders[1].ft_is_open is True
assert orders[2].order_id == 'dry_stop_order_id11X'
assert orders[2].ft_order_side == 'stoploss'
assert orders[2].ft_is_open is False
orders1 = Order.session.scalars(select(Order)).all()
assert len(orders1) == 5
order = orders1[4]
assert order.ft_trade_id == 2
assert order.ft_is_open is False
def test_migrate_too_old(mocker, default_conf, fee, caplog):
"""