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.

Reply via email to