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

Posted

技术标签:

【中文标题】添加新列时在alembic中设置列顺序【英文标题】:Set column order in alembic when adding a new column 【发布时间】:2018-11-09 03:29:45 【问题描述】:

我正在努力寻找一种干净的方法(没有原始 SQL)来设置 alembic 中的列顺序。例如,我想在 'id' 列之后添加一个名为 'name' 的新列,如下所示:

from alembic import op
import sqlalchemy as sa

...

op.add_column(
    'people',
    sa.Column(
        'name',
        sa.String(),
        nullable=False
    ),
    after='id'
)

当然,alembic 没有 'after' 参数,因此此代码失败,并且我在文档中没有找到与此 'after' 参数等效的参数。我只能在表格末尾追加列。

有人可以建议如何在 alembic/sqlalchemy 中实现我想要的吗?没有原始 SQL 是否可行?

【问题讨论】:

你用的是什么数据库? PostgreSQL 版本 9.6 您不能指定新列的位置:dba.stackexchange.com/questions/3276/…。这是 Postgres 中的一个限制。 mysql 怎么样? @dbatten 否,但根据 dev.mysql.com/doc/refman/5.6/en/alter-table.html 可以使用原始 SQL 命令(使用 [FIRST | AFTER col_name] 【参考方案1】:

将它们分割成单独的嵌套列表,在插入列之前的列结束(因此在这种情况下,创建一个以“id”列结束的嵌套列表。

我们称这个变量为 id_col

现在,您可以使用“extend”内置或“append”在 id 列之后添加“name”列。

您还可以添加嵌套列表,最终得到一个包含您要查找的内容的最终单一数据结构。

这里的重点是,您不必受限于仅使用 SQL 表格式。您可以将其转换为嵌套列表,然后使用列表方法组合后,将它们重新转换回所需的 SQL 表。

【讨论】:

以上是关于添加新列时在alembic中设置列顺序的主要内容,如果未能解决你的问题,请参考以下文章

使用alembic进行数据库版本管理

使用alembic进行数据库版本管理

为啥 Django 在添加新列时会删除 SQL DEFAULT 约束?

在 Mysql 中添加新列时如何轻松维护审计触发器

如何在使用 Sequelize 更改列或添加新列时更新迁移文件

使用alembic为SQLAlchemy迁移数据