【发布时间】: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