Как программно установить '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.