gpt4 book ai didi

sqlalchemy - 使用 Flask-SQLAlchemy 在 Alembic 自动生成迁移中未检测到任何变化

转载 作者:行者123 更新时间:2023-12-03 12:06:17 27 4
gpt4 key购买 nike

我无法让 Alembic 使用 db.Model 自动生成从更改到类的候选迁移(Flask-SQLAlchemy) 而不是 Base .

我修改了 env.py创建我的 Flask 应用程序,导入所有相关模型,初始化数据库,然后运行迁移:

...
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() (例如,在为单元测试重新创建测试数据库时),但在这种情况下似乎失败了。自动生成的版本脚本总是有空的升级和降级方法,例如,
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 ###

我的更改包括重命名列、更改列定义等,而不仅仅是对索引和外键的更改。

有没有人在 Flask-SQLAlchemy 中使用 Alembic?知道我哪里出错了吗?

非常感谢!

最佳答案

Alembic 无法自动检测表或列重命名。默认情况下,它也不会查找列类型更改,而是查找 compare_type可以为此启用选项。

摘自 Alembic 文档:

默认情况下,自动生成将检测:

  • 表的添加、删除。
  • 列添加、删除。
  • 列上可为空状态的更改。

  • Autogenerate 可以选择检测:
  • 更改列类型。如果您设置 compare_type=True,就会发生这种情况。在 EnvironmentContext.configure() .该功能在大多数情况下运行良好,但默认情况下处于关闭状态,以便可以首先在目标模式上进行测试。也可以通过在此处传递一个可调用对象来自定义;有关详细信息,请参阅函数的文档。
  • 更改服务器默认设置。如果您设置 compare_server_default=True,就会发生这种情况。在 EnvironmentContext.configure() .此功能适用于简单情况,但不能始终产生准确的结果。 Postgresql 后端实际上会针对数据库调用“检测到”和“元数据”值以确定等效性。该功能默认处于关闭状态,因此可以先在目标架构上进行测试。和类型比较一样,也可以通过传递一个callable来自定义;有关详细信息,请参阅函数的文档。

  • 自动生成无法检测:
  • 表名的变化。这些将作为两个不同表的添加/删除出现,并且应该手动编辑为名称更改。
  • 列名的变化。与表名更改一样,这些被检测为列添加/删除对,这与名称更改完全不同。
  • 特殊的 SQLAlchemy 类型,例如 Enum在不支持 ENUM 的后端生成时直接 - 这是因为这种类型在不支持的数据库中的表示,即 CHAR+CHECK约束,可以是任何类型的 CHAR+CHECK . SQLAlchemy 确定这实际上是一个 ENUM这只是一个猜测,这通常是一个坏主意。要在此处实现您自己的“猜测”功能,请使用 sqlalchemy.events.DDLEvents.column_reflect()更改为某些列传递的 SQLAlchemy 类型的事件,可能还有 sqlalchemy.events.DDLEvents.after_parent_attach()拦截不需要的 CHECK约束。

  • Autogenerate 目前不能,但最终会检测:
  • 独立约束的添加、删除,例如 CHECK , UNIQUE , FOREIGN KEY - 这些尚未实现。现在,您将在新表中获得约束、“降级”到先前存在的表的 PK 和 FK 约束,以及 CHECK使用 SQLAlchemy “模式”类型生成的约束 Boolean , Enum .
  • 索引添加、删除 - 尚未实现。
  • 序列添加、删除 - 尚未实现。

  • 更新:Alembic 0.7.x 版本支持最后一个列表中的一些项目。

    关于sqlalchemy - 使用 Flask-SQLAlchemy 在 Alembic 自动生成迁移中未检测到任何变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409724/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com