【发布时间】:2019-04-14 22:10:30
【问题描述】:
我无法使用 SQLAlchemy 和 Alembic 更改现有的 postgresql.ENUM 列。
我想向 alembic 中的 postgresql.ENUM 类型列添加/删除一个值。
具体来说,当前枚举类型是由以下两个 alembic 修订创建的:
# revision 1
def upgrade():
op.create_table('kernels',
sa.Column('status', sa.String(), nullable=True),
...
)
# revision 2
kernelstatus_choices = (
'PREPARING', 'BUILDING', 'RUNNING',
'RESTARTING', 'RESIZING', 'SUSPENDED',
'TERMINATING', 'TERMINATED', 'ERROR',
)
kernelstatus = postgresql.ENUM(
*kernelstatus_choices,
name='kernelstatus')
def upgrade():
op.alter_column('kernels', column_name='status',
type_=sa.Enum(*kernelstatus_choices, name='kernelstatus'),
postgresql_using='status::kernelstatus')
现在,我想将'PENDING' 状态添加到kernelstatus 类型。所以我通过引用somearticles来实现如下所示。
prev_kernelstatus_choices = (
'PREPARING', 'BUILDING', 'RUNNING',
'RESTARTING', 'RESIZING', 'SUSPENDED',
'TERMINATING', 'TERMINATED', 'ERROR',
)
prev_kernelstatus = postgresql.ENUM(
*prev_kernelstatus_choices,
name='kernelstatus')
curr_kernelstatus_choices = ('PENDING',) + prev_kernelstatus_choices
curr_kernelstatus = postgresql.ENUM(
*curr_kernelstatus_choices,
name='kernelstatus')
def upgrade():
op.execute('ALTER TYPE kernelstatus RENAME TO kernelstatus_old;')
curr_kernelstatus.create(op.get_bind())
op.alter_column('kernels', column_name='status',
type_=sa.Enum(*curr_kernelstatus_choices, name='kernelstatus'),
postgresql_using='status::text::kernelstatus')
op.execute('DROP TYPE kernelstatus_old;')
但它不断产生以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) operator does not exist: kernelstatus <> kernelstatus_old
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
[SQL: 'ALTER TABLE kernels ALTER COLUMN status TYPE kernelstatus USING status::text::kernelstatus']
我已经尝试过使用adding value to enum type 的解决方案,但这不适用于Alembic,因为每个Alembic 修订版都在事务中运行,而ALTER TYPE 语句不能在事务中运行。另外,downgrade() 应该有一个代码,并且在 PostgreSQL 中没有从枚举类型中删除值的语句,因此在我的情况下,仅向枚举类型添加一个值并不是最终的解决方案。
有人可以帮我吗?
【问题讨论】:
-
我尝试在我的 PostgreSQL v11 数据库上运行这些 SQL 语句,它们运行良好。
-
嗯...我的是v9.6,所以可能是由于版本不同。我将尝试使用 v11。感谢您的帮助!
-
我刚刚在 9.6 数据库上运行了 SQL 语句,它也能正常工作。所以我相信错误消息一定是由其他原因引起的 - 可能是其中带有
<>运算符的一些语句。没有为ALTER TABLE定义事件触发器,有吗?
标签: postgresql enums sqlalchemy alembic