From c31cb6711874b99f175c1508475d75ad69da4c5a Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 6 Apr 2021 14:53:08 +0200 Subject: [PATCH] Further changes for sqlalchemy 1.4 --- freqtrade/persistence/migrations.py | 21 ++++++++++++--------- freqtrade/persistence/models.py | 2 +- tests/test_persistence.py | 29 ++++++++++++++++------------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/freqtrade/persistence/migrations.py b/freqtrade/persistence/migrations.py index d89256baf..bb6860373 100644 --- a/freqtrade/persistence/migrations.py +++ b/freqtrade/persistence/migrations.py @@ -1,7 +1,7 @@ import logging from typing import List -from sqlalchemy import inspect +from sqlalchemy import inspect, text 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') # Schema migration necessary - engine.execute(f"alter table trades rename to {table_back_name}") - # drop indexes on backup table - for index in inspector.get_indexes(table_back_name): - engine.execute(f"drop index {index['name']}") + with engine.begin() as connection: + connection.execute(text(f"alter table trades rename to {table_back_name}")) + # drop indexes on backup table + for index in inspector.get_indexes(table_back_name): + connection.execute(text(f"drop index {index['name']}")) # let SQLAlchemy create the schema as required decl_base.metadata.create_all(engine) # 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, fee_open, fee_open_cost, fee_open_currency, 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, {open_trade_value} open_trade_value, {close_profit_abs} close_profit_abs from {table_back_name} - """) + """)) 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) select id ft_trade_id, pair ft_pair, open_order_id, 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 from trades where stoploss_order_id is not null - """) + """)) def migrate_orders_table(decl_base, inspector, engine, table_back_name: str, cols: List): diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index 6733b66a6..6754623a8 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -9,7 +9,7 @@ from typing import Any, Dict, List, Optional from sqlalchemy import (Boolean, Column, DateTime, Float, ForeignKey, Integer, String, create_engine, desc, func, inspect) 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.session import sessionmaker from sqlalchemy.pool import StaticPool diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 669f220bb..1814ddbbe 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -7,7 +7,7 @@ from unittest.mock import MagicMock import arrow import pytest -from sqlalchemy import create_engine, inspect +from sqlalchemy import create_engine, inspect, text from freqtrade import constants 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) # Create table using the old format - engine.execute(create_table_old) - engine.execute(insert_table_old) - engine.execute(insert_table_old2) + with engine.begin() as connection: + connection.execute(text(create_table_old)) + connection.execute(text(insert_table_old)) + connection.execute(text(insert_table_old2)) # Run init to test migration 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) # Create table using the old format - engine.execute(create_table_old) - engine.execute("create index ix_trades_is_open on trades(is_open)") - engine.execute("create index ix_trades_pair on trades(pair)") - engine.execute(insert_table_old) + with engine.begin() as connection: + connection.execute(text(create_table_old)) + connection.execute(text("create index ix_trades_is_open on trades(is_open)")) + connection.execute(text("create index ix_trades_pair on trades(pair)")) + connection.execute(text(insert_table_old)) - # fake previous backup - engine.execute("create table trades_bak as select * from trades") + # fake previous backup + 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 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) # Create table using the old format - engine.execute(create_table_old) - engine.execute(insert_table_old) + with engine.begin() as connection: + connection.execute(text(create_table_old)) + connection.execute(text(insert_table_old)) # Run init to test migration init_db(default_conf['db_url'], default_conf['dry_run'])