Alembic 可以自动生成列更改吗?

Posted

技术标签:

【中文标题】Alembic 可以自动生成列更改吗?【英文标题】:Can Alembic Autogenerate column alterations? 【发布时间】:2013-06-15 00:10:51 【问题描述】:

我可以使用 alembic --autogenerate 用于添加/删除列时。

但是,例如,当我想将“url”列从 200 个字符修改为 2000 个字符时,它不会检测到更改。

如何制作 Alembic(使用 SQLAlchemy)、检测更改并自动生成脚本到我的模型的各种列的“大小”并为 PostgreSQL 创建“alter_column”命令??

编辑:

为什么alembic没有自动添加:

op.alter_column('mytable', 'url', type_=sa.String(2000), existing_type=sa.String(length=200), nullable=True)

【问题讨论】:

【参考方案1】:

我也遇到过这个问题,在alembic 1.0.8def run_migrations_online() 文件中的context.configure migrations/env.py 函数会是这样的:

with connectable.connect() as connection:
    context.configure(
        connection=connection,
        target_metadata=target_metadata,
        process_revision_directives=process_revision_directives,
        **current_app.extensions['migrate'].configure_args,
    )

只需删除或评论process_revision_directives=process_revision_directives,然后在上面添加compare_type=True

像这样:

with connectable.connect() as connection:
    context.configure(
        connection=connection,
        target_metadata=target_metadata,
        # process_revision_directives=process_revision_directives,
        **current_app.extensions['migrate'].configure_args,
        compare_type=True
    )

【讨论】:

您能否详细说明为什么此解决方案需要注释掉 theprocess_revision_directives=process_revision_directives 行?谢谢【参考方案2】:

看起来我在 reddit 的 /r/flask 上找到了答案。

http://www.reddit.com/r/flask/comments/1glejl/alembic_autogenerate_column_changes/cale9o0

只需将“compare_type=True”添加到 env.py 的“run_migrations_online”函数中的 context.configure() 参数即可。

    context.configure(
                connection=connection,
                target_metadata=target_metadata,
                compare_type=True
                )

【讨论】:

这确实需要成为默认设置,或者至少在如何打开它方面更加明显。 这是我的救命稻草。

以上是关于Alembic 可以自动生成列更改吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

您可以在自动排序DataGrid中更改列的初始排序方向吗?

Alembic 自动生成空迁移文件

如何在excel中自动填充列?

使用 Alembic 更改枚举字段

添加新列时在alembic中设置列顺序