我正在尝试使用 Alembic 将 PostgreSQL 中的列类型从 ENUM 更改为 INTEGER(这也是外键)。但是,当我尝试升级迁移时,遇到以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.CannotCoerce) 无法将类型 serie_enum 转换为整数 LINE 1: ...R COLUMN serie_aluno TYPE INTEGER USING serie_aluno::integer
[SQL: ALTER TABLE aluno ALTER COLUMN serie_aluno TYPE INTEGER USING serie_aluno::integer]
以下是 Alembic 生成的迁移文件:
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('aluno', 'serie_aluno',
existing_type=postgresql.ENUM('6', '7', '8', '9', name='serie_enum'),
type_=sa.Integer(),
existing_nullable=False,
postgresql_using="NULL")
op.create_foreign_key(None, 'aluno', 'serie', ['serie_aluno'], ['id_serie'])
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'aluno', type_='foreignkey')
op.alter_column('aluno', 'serie_aluno',
existing_type=sa.Integer(),
type_=postgresql.ENUM('6', '7', '8', '9', name='serie_enum'),
existing_nullable=False)
# ### end Alembic commands ###
如何才能成功地将列从 ENUM 转换为 INTEGER,同时确保正确创建外键约束?
对于任何感兴趣的人来说,解决方案实际上非常简单,基本上,我按照我的朋友 Erwin 的建议添加了 sql 命令。
没有定义从自定义枚举类型
serie_aluno
到的强制类型转换integer
。(除非您明确创建这样的强制类型转换。)但一切都可以转换为
text
。如果所有枚举值都由有效的整数文字表示,则可以使用text
作为垫脚石:然后添加指向某一列的约束:
FOREIGN KEY
integer
或者在单个ALTER TABLE命令中执行此操作:
小提琴
这有点混乱,但我必须先通过一次更改使该列可空,然后才能进行后续更改以更改类型并将所有值设置为。如果您知道映射并使用您说不需要但我认为很酷的语句,
NULL
您实际上可以将枚举迁移到硬编码整数。CASE