mirror of
https://github.com/freqtrade/freqtrade.git
synced 2026-01-20 05:50:36 +00:00
Fix migrations
This commit is contained in:
@@ -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.")
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user