Further changes for sqlalchemy 1.4

This commit is contained in:
Matthias 2021-04-06 14:53:08 +02:00
parent 2f79958acb
commit c31cb67118
3 changed files with 29 additions and 23 deletions

View File

@ -1,7 +1,7 @@
import logging import logging
from typing import List from typing import List
from sqlalchemy import inspect from sqlalchemy import inspect, text
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -62,15 +62,17 @@ def migrate_trades_table(decl_base, inspector, engine, table_back_name: str, col
amount_requested = get_column_def(cols, 'amount_requested', 'amount') amount_requested = get_column_def(cols, 'amount_requested', 'amount')
# Schema migration necessary # Schema migration necessary
engine.execute(f"alter table trades rename to {table_back_name}") with engine.begin() as connection:
# drop indexes on backup table connection.execute(text(f"alter table trades rename to {table_back_name}"))
for index in inspector.get_indexes(table_back_name): # drop indexes on backup table
engine.execute(f"drop index {index['name']}") for index in inspector.get_indexes(table_back_name):
connection.execute(text(f"drop index {index['name']}"))
# let SQLAlchemy create the schema as required # let SQLAlchemy create the schema as required
decl_base.metadata.create_all(engine) decl_base.metadata.create_all(engine)
# Copy data back - following the correct schema # Copy data back - following the correct schema
engine.execute(f"""insert into trades with engine.begin() as connection:
connection.execute(text(f"""insert into trades
(id, exchange, pair, is_open, (id, exchange, pair, is_open,
fee_open, fee_open_cost, fee_open_currency, fee_open, fee_open_cost, fee_open_currency,
fee_close, fee_close_cost, fee_open_currency, open_rate, fee_close, fee_close_cost, fee_open_currency, open_rate,
@ -104,11 +106,12 @@ def migrate_trades_table(decl_base, inspector, engine, table_back_name: str, col
{strategy} strategy, {timeframe} timeframe, {strategy} strategy, {timeframe} timeframe,
{open_trade_value} open_trade_value, {close_profit_abs} close_profit_abs {open_trade_value} open_trade_value, {close_profit_abs} close_profit_abs
from {table_back_name} from {table_back_name}
""") """))
def migrate_open_orders_to_trades(engine): def migrate_open_orders_to_trades(engine):
engine.execute(""" with engine.begin() as connection:
connection.execute(text("""
insert into orders (ft_trade_id, ft_pair, order_id, ft_order_side, ft_is_open) insert into orders (ft_trade_id, ft_pair, order_id, ft_order_side, ft_is_open)
select id ft_trade_id, pair ft_pair, open_order_id, select id ft_trade_id, pair ft_pair, open_order_id,
case when close_rate_requested is null then 'buy' case when close_rate_requested is null then 'buy'
@ -120,7 +123,7 @@ def migrate_open_orders_to_trades(engine):
'stoploss' ft_order_side, 1 ft_is_open 'stoploss' ft_order_side, 1 ft_is_open
from trades from trades
where stoploss_order_id is not null where stoploss_order_id is not null
""") """))
def migrate_orders_table(decl_base, inspector, engine, table_back_name: str, cols: List): def migrate_orders_table(decl_base, inspector, engine, table_back_name: str, cols: List):

View File

@ -9,7 +9,7 @@ from typing import Any, Dict, List, Optional
from sqlalchemy import (Boolean, Column, DateTime, Float, ForeignKey, Integer, String, from sqlalchemy import (Boolean, Column, DateTime, Float, ForeignKey, Integer, String,
create_engine, desc, func, inspect) create_engine, desc, func, inspect)
from sqlalchemy.exc import NoSuchModuleError from sqlalchemy.exc import NoSuchModuleError
from sqlalchemy.orm import Query, relationship, declarative_base from sqlalchemy.orm import Query, declarative_base, relationship
from sqlalchemy.orm.scoping import scoped_session from sqlalchemy.orm.scoping import scoped_session
from sqlalchemy.orm.session import sessionmaker from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.pool import StaticPool from sqlalchemy.pool import StaticPool

View File

@ -7,7 +7,7 @@ from unittest.mock import MagicMock
import arrow import arrow
import pytest import pytest
from sqlalchemy import create_engine, inspect from sqlalchemy import create_engine, inspect, text
from freqtrade import constants from freqtrade import constants
from freqtrade.exceptions import DependencyException, OperationalException from freqtrade.exceptions import DependencyException, OperationalException
@ -486,9 +486,10 @@ def test_migrate_old(mocker, default_conf, fee):
mocker.patch('freqtrade.persistence.models.create_engine', lambda *args, **kwargs: engine) mocker.patch('freqtrade.persistence.models.create_engine', lambda *args, **kwargs: engine)
# Create table using the old format # Create table using the old format
engine.execute(create_table_old) with engine.begin() as connection:
engine.execute(insert_table_old) connection.execute(text(create_table_old))
engine.execute(insert_table_old2) connection.execute(text(insert_table_old))
connection.execute(text(insert_table_old2))
# Run init to test migration # Run init to test migration
init_db(default_conf['db_url'], default_conf['dry_run']) init_db(default_conf['db_url'], default_conf['dry_run'])
@ -579,15 +580,16 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
mocker.patch('freqtrade.persistence.models.create_engine', lambda *args, **kwargs: engine) mocker.patch('freqtrade.persistence.models.create_engine', lambda *args, **kwargs: engine)
# Create table using the old format # Create table using the old format
engine.execute(create_table_old) with engine.begin() as connection:
engine.execute("create index ix_trades_is_open on trades(is_open)") connection.execute(text(create_table_old))
engine.execute("create index ix_trades_pair on trades(pair)") connection.execute(text("create index ix_trades_is_open on trades(is_open)"))
engine.execute(insert_table_old) connection.execute(text("create index ix_trades_pair on trades(pair)"))
connection.execute(text(insert_table_old))
# fake previous backup # fake previous backup
engine.execute("create table trades_bak as select * from trades") connection.execute(text("create table trades_bak as select * from trades"))
engine.execute("create table trades_bak1 as select * from trades") connection.execute(text("create table trades_bak1 as select * from trades"))
# Run init to test migration # Run init to test migration
init_db(default_conf['db_url'], default_conf['dry_run']) init_db(default_conf['db_url'], default_conf['dry_run'])
@ -722,8 +724,9 @@ def test_migrate_mid_state(mocker, default_conf, fee, caplog):
mocker.patch('freqtrade.persistence.models.create_engine', lambda *args, **kwargs: engine) mocker.patch('freqtrade.persistence.models.create_engine', lambda *args, **kwargs: engine)
# Create table using the old format # Create table using the old format
engine.execute(create_table_old) with engine.begin() as connection:
engine.execute(insert_table_old) connection.execute(text(create_table_old))
connection.execute(text(insert_table_old))
# Run init to test migration # Run init to test migration
init_db(default_conf['db_url'], default_conf['dry_run']) init_db(default_conf['db_url'], default_conf['dry_run'])