Alembic переносится с помощью существующего механизма SQLAlchemy

Javier Novoa C. спросил: 26 декабря 2017 в 08:14 в: python

У меня есть определенная база данных SQLAlchemy, которую я создаю в базе данных SQL-памяти:

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)

Я использую это для логики модульного тестирования.

С этим у меня есть мои таблицы в БД. Но теперь я хочу перенести некоторые вещи с помощью alembic.

AFAIK alembic migrations использует env.py run_migrations_online, и там используется функция SQLAlchemy под названием engine_from_config, создающая новый движок здесь .

Проблема, которую я хочу решить, - иметь способ использовать ранее созданное соединение, которое содержит недавно созданные таблицы, для миграций alembic.

Я использовал это на своем тестовые скрипты: Использование API Alembic из внутреннего кода приложения , так что мой скрипт выполняет следующие действия после предыдущего вызова create_all:

import alembic.config
alembicArgs = ['--raiseerr', '-x', 'dbPath=sqlite:///:memory:', 'upgrade', 'head']
alembic.config.main(argv=alembicArgs

[Пожалуйста, возражайте, я просто создаю свои схемы с помощью вызова Base.metadata.create_all(engine), но мои версии alembic не только содержат изменения схемы, но также имеют некоторое заполнение данных таблиц каталога, поэтому я намереваюсь для использования здесь alembic. На самом деле, если мои миграции в алембике содержат некоторую логику "создания таблиц", эти два конфликтуют. Поэтому я могу безопасно удалить вызов create_all и зависеть только от alembic, чтобы создать мои схемы здесь.]

После изменения моего кода env.py:

def run_migrations_online():
    ini_section = config.get_section(config.config_ini_section)    db_path = context.get_x_argument(as_dictionary=True).get('dbPath')    if db_path:
        ini_section['sqlalchemy.url'] = db_path    connectable = engine_from_config(
        ini_section,
        prefix ... # everything from here the same as default env.py

Насколько я могу сказать, connectable=engine_from_config создает соединение с новым движком в новой базе данных sqlite:///:memory:, и именно поэтому я не могу обновить через alembic ранее созданный БД на моем скрипте с помощью create_all(engine).

Итак ... TLDR; есть способ передать мое ранее существующее соединение с двигателем (с моими созданными таблицами) в alembic, чтобы он мог его перенести? (Я почти уверен, что созданный dbPath аргумент, который я создал, бесполезен здесь, на самом деле, я просто копирую то, что использует другое сообщение, на которое я ссылаюсь).


0 ответов