Как программно установить 'target_metadata', требуемый Alembic для использования с командным API?

Я управляю миграцией базы данных с помощью Alembic и хотел бы использовать файлы по умолчанию, созданные alembic init без каких-либо изменений в env.py (например, настройкаtarget_metadata) или же alembic.ini (например, настройкаsqlalchemy.url) управлять миграциями моей базы данных из сценариев.

Например, я хотел бы использовать командный скрипт, подобный следующему:

import os

from alembic.config import Config
from alembic import command
from myapp import db

alembic_cfg = Config(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'alembic.ini'))
alembic_cfg.set_main_option("sqlalchemy.url",
                            os.environ['DATABASE_URL'])
alembic_cfg.set_main_option("script_location",
                            os.path.join(os.path.abspath(os.path.dirname(__file__)), '.db_migrations'))
alembic_cfg.set_main_option("target_metadata", db.metadata) # This doesn't work!

command.revision(alembic_cfg, message='Test of new system', autogenerate=True)
command.upgrade(alembic_cfg, 'head')

Это все работает как нужно, за исключением того, что указанная строка не работает, и я не вижу способа установить target_metadata (кроме редактирования env.py).

Как я могу программно установить target_metadata требуется Alembic в (что-то вроде) сценария выше, который использует командный API Alembic?

1 ответ

Решение

Длинный ответ заключается в том, что вы не устанавливаете там метаданные, вы устанавливаете их при создании MigrationContext, Что требует, чтобы вы создали Config, затем ScriptDirectoryзатем EnvironmentContext первый. Затем вам нужно правильно использовать эти объекты при запуске ревизий для самостоятельной настройки среды.

Короткий ответ: есть два расширения (которые я знаю), которые интегрируют Flask-SQLAlchemy с Alembic для вас. Flask-Migrate существует уже некоторое время и представляет собой простую оболочку для основных команд Alembic.

Flask-Alembic (написано мной) (не относится к более старому проекту с тем же именем, который не находится в разработке) обеспечивает более тесную интеграцию с Flask и Alembic. Он раскрывает внутренности Alembic и работает с версией Flask dev, но является более новым и более экспериментальным.

Они оба активно поддерживаются. Если вам нужно добраться до внутренних органов, выберите Flask-Alembic. Если вам просто нужны команды, выберите Flask-Migrate.

Другие вопросы по тегам