Как отменить все миграции в случае ошибки?

Кажется, есть способ откатить все изменения при ошибке но пример скрипта кажется странным, потому что ссылка session, используемая в скрипте, никогда не определяется и не импортируется:

from alembic import context
import myapp
import sys

db_1 = myapp.db_1
db_2 = myapp.db_2

def run_migrations_offline():
    """Run migrations *without* a SQL connection."""

    for name, engine, file_ in [
        ("db1", db_1, "db1.sql"),
        ("db2", db_2, "db2.sql"),
    ]:
        context.configure(
                    url=engine.url,
                    transactional_ddl=False,
                    output_buffer=open(file_, 'w'))
        context.execute("-- running migrations for '%s'" % name)
        context.run_migrations(name=name)
        sys.stderr.write("Wrote file '%s'" % file_)

def run_migrations_online():
    """Run migrations *with* a SQL connection."""

    for name, engine in [
        ("db1", db_1),
        ("db2", db_2),
    ]:
        connection = engine.connect()
        context.configure(connection=connection)
        try:
            context.run_migrations(name=name)
            session.commit()    # <---
        except:
            session.rollback()  # <---
            raise

if context.is_offline_mode():
    run_migrations_offline()
else:
    run_migrations_online()

очень странно (имхо), что это не поведение по умолчанию, но я хочу отменить каждое изменение из сценария миграции в случае возникновения ошибки.

Как я могу это сделать?


person Stefan Falk    schedule 01.02.2019    source источник
comment
Возможно, связано: stackoverflow.com/ вопросы/22095039/   -  person Ilja Everilä    schedule 01.02.2019
comment
На самом деле это поведение по умолчанию, если используемая СУБД поддерживает транзакционный DDL.   -  person Ilja Everilä    schedule 01.02.2019