如何在Alembic/SQLAlchemy中使用USING子句?

17

我希望使用Alembic将数据库中的列类型从字符串更改为整数。如果我使用纯SQL,就能达到这个目标:

alter table statistic_ticket alter column tags type bigint using tags::bigint;

但是当我像这样使用Alembic:

import sqlalchemy as sa
def upgrade():
    op.alter_column('statistic_ticket', 'tags', nullable = True, existing_type=sa.String(length=255), type_=sa.Integer, existing_nullable=True)

我遇到了一个错误:

HINT: Please use USING clause for carrying out the conversion
< p > SQLAlchemy 生成的 SQL 语句为:

ALTER TABLE statistic_ticket ALTER COLUMN tags TYPE INTEGER' {}

有人能展示给我如何通过op.execute(SQL)在alembic或SQLAlchemy中执行SQL吗?


我整理了你的问题,包括投票关闭你在同一主题上发布的其他问题。我还将此问题标记为PostgreSQL,因为这是你标记其他问题的内容。你能确认你正在使用的数据库是PostgreSQL吗?感谢。 - Mark Hildreth
谢谢,看起来 sqlalchemy/alembic 不支持在 PostgreSQL 上使用 USING 子句。 - SieuTruc
你是否找到了那个信息的权威来源?如果是这样,我建议你回答自己的问题,明确指出Alembic不支持“USING”子句,并包含该来源,然后将你的答案标记为问题的答案。 - Mark Hildreth
事实上,我可以使用op.execute("SQL字符串")来完成,但无法使用sqlachemy或alembic的默认函数来完成。 - SieuTruc
1
我认为“USING”子句目前不被直接支持,因此使用op.execute()是最直接的方法。另一种方法是为alembic.ddl.impl.ColumnType创建自定义@compile指令,但这需要更多的工作。要进行条件检查,请检查op.get_bind().dialect.name是否为“postgresql”,如果要返回通用alter_column()。 - zzzeek
基本上是与 https://dev59.com/U14b5IYBdhLWcg3wdxrG 相同的问题。 - Dag Høidahl
1个回答

16

从Alembic 0.8.8版本开始,您可以使用postgresql_using关键字:

op.alter_column('statistic_ticket', 'tags', type_=sa.BigInteger,
                postgresql_using='tags::bigint')

在之前的版本中,您需要使用 op.execute

op.execute('ALTER TABLE statistic_ticket ALTER COLUMN '
           'tags TYPE bigint USING tags::bigint')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接