添加新列时在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中设置列顺序的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Django 在添加新列时会删除 SQL DEFAULT 约束?