From 065b37a1475a9ebaddf67e5a11137026640d4a6e Mon Sep 17 00:00:00 2001 From: Konstantin Lopuhin Date: Thu, 16 Jun 2016 17:51:01 +0300 Subject: [PATCH 1/2] Check if table already exists before recreating it If we have SQLALCHEMYBACKEND_DROP_ALL_TABLES = False, then without this fix we will fail to start db and strategy workers with an existing database. --- frontera/contrib/backends/sqlalchemy/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontera/contrib/backends/sqlalchemy/__init__.py b/frontera/contrib/backends/sqlalchemy/__init__.py index e1625f537..23af17e3c 100644 --- a/frontera/contrib/backends/sqlalchemy/__init__.py +++ b/frontera/contrib/backends/sqlalchemy/__init__.py @@ -132,7 +132,7 @@ def strategy_worker(cls, manager): if drop_all_tables: if model.__table__.name in inspector.get_table_names(): model.__table__.drop(bind=b.engine) - model.__table__.create(bind=b.engine) + model.__table__.create(bind=b.engine, checkfirst=True) if clear_content: session = b.session_cls() @@ -158,8 +158,8 @@ def db_worker(cls, manager): metadata_m.__table__.drop(bind=b.engine) if queue_m.__table__.name in existing: queue_m.__table__.drop(bind=b.engine) - metadata_m.__table__.create(bind=b.engine) - queue_m.__table__.create(bind=b.engine) + metadata_m.__table__.create(bind=b.engine, checkfirst=True) + queue_m.__table__.create(bind=b.engine, checkfirst=True) if clear_content: session = b.session_cls() From e45b4f3fe0dc94b34926f6d305e8bec9f6316e2e Mon Sep 17 00:00:00 2001 From: Konstantin Lopuhin Date: Mon, 20 Jun 2016 12:35:26 +0300 Subject: [PATCH 2/2] Drop with checkfirst=True instead of manual check --- frontera/contrib/backends/sqlalchemy/__init__.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/frontera/contrib/backends/sqlalchemy/__init__.py b/frontera/contrib/backends/sqlalchemy/__init__.py index 23af17e3c..b1da3bdc5 100644 --- a/frontera/contrib/backends/sqlalchemy/__init__.py +++ b/frontera/contrib/backends/sqlalchemy/__init__.py @@ -2,7 +2,6 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -from sqlalchemy.engine.reflection import Inspector from frontera.core.components import DistributedBackend from frontera.contrib.backends import CommonBackend @@ -127,11 +126,9 @@ def strategy_worker(cls, manager): drop_all_tables = settings.get('SQLALCHEMYBACKEND_DROP_ALL_TABLES') clear_content = settings.get('SQLALCHEMYBACKEND_CLEAR_CONTENT') model = b.models['StateModel'] - inspector = Inspector.from_engine(b.engine) if drop_all_tables: - if model.__table__.name in inspector.get_table_names(): - model.__table__.drop(bind=b.engine) + model.__table__.drop(bind=b.engine, checkfirst=True) model.__table__.create(bind=b.engine, checkfirst=True) if clear_content: @@ -148,16 +145,12 @@ def db_worker(cls, manager): settings = manager.settings drop = settings.get('SQLALCHEMYBACKEND_DROP_ALL_TABLES') clear_content = settings.get('SQLALCHEMYBACKEND_CLEAR_CONTENT') - inspector = Inspector.from_engine(b.engine) metadata_m = b.models['MetadataModel'] queue_m = b.models['QueueModel'] if drop: - existing = inspector.get_table_names() - if metadata_m.__table__.name in existing: - metadata_m.__table__.drop(bind=b.engine) - if queue_m.__table__.name in existing: - queue_m.__table__.drop(bind=b.engine) + metadata_m.__table__.drop(bind=b.engine, checkfirst=True) + queue_m.__table__.drop(bind=b.engine, checkfirst=True) metadata_m.__table__.create(bind=b.engine, checkfirst=True) queue_m.__table__.create(bind=b.engine, checkfirst=True)