首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sqlalchemy-migrate将列类型从字符变化更改为整数

如何使用sqlalchemy-migrate将列类型从字符变化更改为整数
EN

Stack Overflow用户
提问于 2013-03-06 00:48:02
回答 1查看 9.7K关注 0票数 0

我正在使用sqlalchemy-migrate来更改Postgre SQL数据库中表中某一列的类型。我使用的升级脚本是:

代码语言:javascript
复制
# -*- cofing: utf-8 -*-

from sqlalchemy import MetaData, Table, Column, String, Integer
from migrate import changeset


metadata = MetaData()


def upgrade(migrate_engine):
    # ALTER TABLE courses ALTER COLUMN number SET DATA TYPE character varying;
    metadata.bind = migrate_engine
    courses = Table('courses', metadata, Column("number", Integer), extend_existing=True)
    courses.c.number.alter(type=String)


def downgrade(migrate_engine):
    # ALTER TABLE courses ALTER COLUMN number SET DATA TYPE integer;
    metadata.bind = migrate_engine
    courses = Table('courses', metadata, Column("number", String), extend_existing=True)
    courses.c.number.alter(type=Integer, cast='numeric')

升级部分似乎可以工作,但降级总是失败,并显示以下错误:

代码语言:javascript
复制
sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "number" cannot be cast to type integer
'\nALTER TABLE courses ALTER COLUMN number TYPE INTEGER' {}

现在,如果我使用的是普通SQL,我可以使用ALTER TABLE courses ALTER COLUMN number TYPE INTEGER USING number::numeric将列类型从character varying改回integer,但我不知道如何使用sqlalchemy-migrate实现这一点。

有没有办法强制sqlalchemy在ALTER子句中包含USING number::numeric?或者有其他方法可以避免我在上面发布的错误?

我很感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-07 01:17:34

看起来sqlalchemy.migrate不支持在将PostgreSQL列类型从字符串更改为整数的情况下呈现有效的查询。

在您的情况下,我会将其实现为直接查询执行,然后继续执行。

代码语言:javascript
复制
def downgrade(migrate_engine):
    # ALTER TABLE courses ALTER COLUMN number SET DATA TYPE integer;
    migrate_engine.execute('ALTER TABLE courses ALTER COLUMN number TYPE INTEGER USING number::numeric')

顺便说一句,从字符串迁移到整数可能会因为不同的原因而失败-当列值包含一些无法转换为数字的值时。因此,我会在应用程序逻辑中添加一些额外的验证,以便以后可以进行降级迁移。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15229475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档