【问题标题】:How to use USING clause in Alembic/SQLAchemy?如何在 Alembic/SQLAlchemy 中使用 USING 子句?
【发布时间】:2014-01-06 22:44:03
【问题描述】:

我想使用 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

SQLAlchemy 生成的 SQL 语句是:

ALTER TABLE statistic_ticket ALTER COLUMN tags TYPE INTEGER' {}

谁能通过op.execute(SQL)告诉我如何在alembic或SQLAlchemy中使用SQL?

【问题讨论】:

  • 我清理了您的问题,包括投票关闭您在同一主题上发布的other question。我还标记了这个问题 PostgreSQL,因为那是你标记的另一个问题。您能否仅验证您正在使用的数据库是 Postgresql,就像您标记了其他数据库一样?谢谢
  • 谢谢,看来 sqlalchemy/alembic 不支持 postgresql 上的 USING 子句。
  • 您是否找到了该信息的权威来源?如果是这样,我建议在您自己的问题中添加一个答案,说明(Alembic 不支持“USING”子句),包括来源,然后将您的答案标记为问题的答案。
  • 其实我可以用 op.execute("SQL string") 来做,但是不能用sqlachemy或者alembic的默认函数来做。
  • 我不认为直接支持“USING”子句,所以目前使用 op.execute() 是最直接的方法。另一种方法是为 alembic.ddl.impl.ColumnType 创建一个自定义的@compile 指令,尽管这涉及更多。要执行条件,请检查 op.get_bind().dialect.name 是否为“postgresql”,如果您想回退到通用的 alter_column()。

标签: python postgresql sqlalchemy alembic


【解决方案1】:

从 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')

【讨论】:

    猜你喜欢
    • 2014-01-17
    • 2015-05-18
    • 2018-06-20
    • 2013-12-26
    • 1970-01-01
    • 2017-01-08
    • 2018-04-22
    • 2015-02-09
    相关资源
    最近更新 更多