当使用早于9.1的PostgreSQL版本(为枚举添加ALTER TYPE)时,如何在alembic迁移中向Enum字段添加元素?这个 SO问题解释了直接过程,但我不太确定如何使用alembic进行翻译.
这就是我所拥有的:
new_type = sa.Enum('nonexistent_executable', 'output_limit_exceeded',
'signal', 'success', 'timed_out', name='status')
old_type = sa.Enum('nonexistent_executable', 'signal', 'success', 'timed_out',
name='status')
tcr = sa.sql.table('testcaseresult',
sa.Column('status', new_type, nullable=False))
def upgrade():
op.alter_column('testcaseresult', u'status', type_=new_type,
existing_type=old_type)
def downgrade():
op.execute(tcr.update().where(tcr.c.status==u'output_limit_exceeded')
.values(status='timed_out'))
op.alter_column('testcaseresult', u'status', type_=old_type,
existing_type=new_type)
Run Code Online (Sandbox Code Playgroud)
不幸的是,上面只ALTER TABLE testcaseresult ALTER COLUMN status TYPE status在升级时产生,基本上什么也没做.
我找到了如何增加价值TYPE.但是我怎样才能从中消除价值呢?
例如,我有TYPE与enum价值观('A','B','C').怎么删除'C'?
我想通过添加新的枚举值来扩展我的枚举类型。这非常简单。我还将所有 SQL 保留在迁移中,并将每个向上迁移与对称向下迁移配对,将架构恢复到之前的状态。
\n\n但是,不支持反向操作 \xe2\x80\x94 从枚举 \xe2\x80\x94 中删除变体。
\n\n这方面的常用方法是什么?我可以看到两个选项:
\n\nif not exists,并在“向下”迁移中不执行任何操作。我不喜欢这个选项,因为它违反了这样的假设:应用和恢复迁移会使架构保持与之前相同的状态。假设我有以下枚举:
CREATE TYPE "my_enum" AS ENUM('value1', 'value2', 'value3');
Run Code Online (Sandbox Code Playgroud)
我想要删除value3。从我在文档和以前的线程中看到的内容来看,我实际上必须删除整个枚举并使用我想要的值重新创建它。像这样的东西:
DROP TYPE IF EXISTS "my_enum";
CREATE TYPE "my_enum" AS ENUM('value1', 'value2');
Run Code Online (Sandbox Code Playgroud)
问题是我有其他依赖于这个枚举的表,所以它不允许我这样做。我收到以下消息(理所当然):
错误:无法删除类型“my_enum”,因为其他对象依赖于它
所以我的问题是如何在不删除整个内容的情况下删除一个枚举值?我知道我可以通过更改以下内容轻松添加值:
ALTER TYPE "my_enum" ADD VALUE 'value4';
Run Code Online (Sandbox Code Playgroud)
所以我认为我可以在删除时做一些等效的事情。
谢谢!
我试图将brs.parts表中的列从字符变为boolean更新.到目前为止,该列的数据为Y/N. 我正在使用以下命令
ALTER TABLE brs.parts ALTER COLUMN is_dpm_scanned TYPE BOOLEAN USING is_dpm_scanned::BOOLEAN
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
*********错误**********
ERROR: default for column "is_dpm_scanned" cannot be cast automatically to type boolean
SQL state: 42804
Run Code Online (Sandbox Code Playgroud)
表定义是:
CREATE TABLE brs.parts (
id serial NOT NULL PRIMARY KEY,
webcrt_part_id INTEGER,
event_id INTEGER,
webcrt_job_id INTEGER,
incoming_serial_number CHARACTER VARYING(256),
outgoing_serial_number CHARACTER VARYING(256),
part_number CHARACTER VARYING(256),
tag_number NUMERIC,
is_dpm_scanned CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING,
current_operation_id INTEGER,
creation_date DATE,
created_by CHARACTER VARYING(20) NOT NULL,
last_updated_date DATE,
last_updated_by CHARACTER VARYING(20) NOT NULL,
is_delete …Run Code Online (Sandbox Code Playgroud)