我很难让Alembic使用db.Model(Flask-SQLAlchemy)而不是自动生成从更改到类的候选迁移Base。
db.Model
Base
我已经进行了修改,env.py以创建我的Flask应用,导入所有相关模型,初始化数据库,然后运行迁移:
env.py
... uri = 'mysql://user:password@host/dbname?charset=utf8' app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = uri app.config['SQLALCHEMY_ECHO'] = True db.init_app(app) with app.test_request_context(): target_metadata = db.Model.metadata config.set_main_option('sqlalchemy.url', uri) if context.is_offline_mode(): run_migrations_offline() else: run_migrations_online() ...
这种方法适用于drop_all(),create_all()(例如,当重新创建用于单元测试的测试数据库时),但是在这种情况下,它似乎无法实现。自动生成的版本脚本始终具有空的升级和降级方法,例如,
drop_all(),create_all()
def upgrade(): ### commands auto generated by Alembic - please adjust! ### pass ### end Alembic commands ### def downgrade(): ### commands auto generated by Alembic - please adjust! ### pass ### end Alembic commands ###
我的更改包括重命名列,更改列定义等,而不仅仅是对索引和外键的更改。
外面有人将Alembic与Flask-SQLAlchemy结合使用吗?知道我哪里出错了吗?
非常感谢!
Alembic无法自动检测表或列的重命名。默认情况下,它也不会查找列类型更改,但是compare_type可以为此启用该选项。
compare_type
摘自Alembic文档:
默认情况下,自动生成将检测:
更改列类型。如果设置为compare_type=True,则会发生这种情况EnvironmentContext.configure()。该功能在大多数情况下均可正常运行,但默认情况下处于禁用状态,因此可以首先在目标架构上对其进行测试。也可以通过在此处传递可调用项进行自定义;有关详细信息,请参见该功能的文档。 - 更改服务器默认值。如果设置为compare_server_default=True,则会发生这种情况EnvironmentContext.configure()。此功能在简单情况下效果很好,但不能始终产生准确的结果。Postgresql后端实际上将针对数据库调用“检测到的”和“元数据”值以确定等效性。该功能默认情况下处于关闭状态,因此可以先在目标架构上对其进行测试。像类型比较一样,它也可以通过传递可调用对象进行自定义;有关详细信息,请参见该功能的文档。 自动生成无法检测到:
compare_server_default=True
EnvironmentContext.configure()
特殊的SQLAlchemy类型,例如Enum在不ENUM直接支持的后端上生成的-这是因为这种类型在非支持数据库中的表示形式(即CHAR+CHECK约束)可以是任何类型CHAR+CHECK。对于SQLAlchemy来说,确定这实际上ENUM只是一个猜测,这通常是一个坏主意。要在此处实现自己的“猜测”功能,请使用该sqlalchemy.events.DDLEvents.column_reflect()事件来更改为某些列传递的SQLAlchemy类型,并可能sqlalchemy.events.DDLEvents.after_parent_attach()拦截不需要的CHECK约束。 自动生成当前无法执行,但最终会检测到:
Enum
CHAR+CHECK
SQLAlchemy
sqlalchemy.events.DDLEvents.column_reflect()
sqlalchemy.events.DDLEvents.after_parent_attach()
落地约束添加,删除,像CHECK,UNIQUE,FOREIGN KEY-这些都还没有实现。现在你会得到内新表,PK和FK约束约束的“降级”到先前存在的表,以及CHECK与SQLAlchemy的“模式”类型产生的约束Boolean,Enum。
CHECK,UNIQUE,FOREIGN KEY
Boolean,Enum