I went ahead and made the modification as suggested. Alembic and my application are now using the application's database connection and sessions.
However, the system locks up during a migration when I query for some application data which I need for data migration. I use Flask-SqlAlchemy and follow the way they described it to be used (and postgres): When I call > session.query(SomeClass) the migration process blocks in engine/default.py in cursor.execute (this is as far as I can trace it). > def do_execute(self, cursor, statement, parameters, context=None): > cursor.execute(statement, parameters) This is how I create a connection in env.py (Alembic) now: > engine = get_db().engine > connection = engine.connect() `get_db()` is part of the application. It returns an instance of `db = SQLAlchemy(flask_app)` I'm not sure how to debug this any further (I could try to throw out Flask-SqlAlchemy and see how it goes, but would like to find an easier way first). Any suggestions are appreciated. On Friday, May 16, 2014 5:02:57 PM UTC+10, gbr wrote: > > True. I should have modified > > def run_migrations_online(): > """Run migrations in 'online' mode. > > In this scenario we need to create an Engine > and associate a connection with the context. > > """ > engine = engine_from_config( > config.get_section(config.config_ini_section), > prefix='sqlalchemy.', > poolclass=pool.NullPool) > > connection = engine.connect() > > to use the application's session/connection management instead of creating > a new connection. > > Thanks. > > On Wednesday, May 14, 2014 1:01:21 AM UTC+10, Michael Bayer wrote: >> >> if possible, I’d modify env.py to make use of your application’s normal >> engine/session mechanics. There would be no “alembic_get_session()” >> method. Whatever mechanism your app uses to get at the Engine/Session, >> pull it in within env.py and use the exact same environment for migrations. >> >> >> >> >> >> On May 13, 2014, at 8:41 AM, gbr <[email protected]> wrote: >> >> In some Alembic upgrade scripts, I need to use application sessions to >> make use of some code that requires these sessions. To avoid deadlocks from >> blocking transactions I use the following lines to transparently call >> `get_db_session()` regardless of whether Alembic or the application is >> executed: >> >> >> def _alembic_get_db_session(): >> from alembic import op >> alembic_connection = op.get_bind() >> return Session(bind=alembic_connection) >> >> >> def _normal_get_db_session(): >> return scoped_session(session_maker) >> >> >> def get_db_session(): >> if is_alembic_active: >> return _alembic_get_db_session() >> else: >> return _normal_get_db_session() >> >> >> How can I fill out the `is_alembic_active` part? I know that the >> application is running and op.get_bind() is called, the following exception >> is raised (I tried to check with op.get_bind() is None which obviously >> doesn't work). >> >> NameError: Can't invoke function 'get_bind', as the proxy object has not >>> yet been established for the Alembic 'Operations' class. Try placing this >>> code inside a callable. >>> >> >> Any idea? >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy-alembic" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> >> >> -- You received this message because you are subscribed to the Google Groups "sqlalchemy-alembic" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
