without script query example python sqlalchemy database-migration flask-sqlalchemy alembic

python - script - ¿Cómo puedo establecer programáticamente el ''target_metadata'' requerido por Alembic para su uso con el API de comando?



flask-script (1)

La respuesta larga es que no establece metadatos allí, lo configura al crear el MigrationContext . Lo que requiere que cree una Config , luego un ScriptDirectory , luego un EnvironmentContext primero. Luego necesita usar estos objetos correctamente cuando ejecuta revisiones para configurar el entorno usted mismo.

La respuesta corta es que hay dos extensiones (que yo sé) que integran Flask-SQLAlchemy con Alambic para usted. Flask-Migrate ha existido por un tiempo y proporciona una envoltura directa con los comandos básicos de Alembic.

Flask-Alembic (escrito por mí) (no relacionado con un proyecto anterior del mismo nombre que no está en desarrollo) proporciona una integración más estrecha con Flask y Alambic. Expone las partes internas de Alambic y funciona con la versión dev de Flask, pero es más nuevo y más experimental.

Ambos son mantenidos activamente. Si necesita llegar al interior, elija Flask-Alambique. Si solo necesita los comandos, elija Flask-Migrate.

Estoy gestionando las migraciones de bases de datos con Alembic y me gustaría usar los archivos predeterminados generados por el alembic init sin modificaciones a env.py (por ejemplo, establecer target_metadata ) o alembic.ini (por ejemplo, establecer sqlalchemy.url ) para gestionar las migraciones de mi base de datos de scripts.

Por ejemplo, me gustaría utilizar un script basado en comandos como el siguiente:

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'')

Todo esto funciona como se desee, excepto que la línea indicada falla, y no veo una manera de establecer target_metadata (aparte de editar env.py ).

¿Cómo puedo establecer programáticamente el target_metadata requerido por Alembic en (algo así como) el script anterior, que usa la API de comandos de Alembic?