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

标签 python postgresql sqlalchemy sqlalchemy-migrate

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

# -*- 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')

升级部分似乎有效,但降级总是失败并出现以下错误:

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?还是有其他方法可以避免我在上面发布的错误?

感谢您的帮助。

最佳答案

看起来 sqlalchemy.migrate 不支持在 postgresql 从 String 更改为 Integer 列类型的情况下呈现有效查询。

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

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

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

关于python - 如何使用 sqlalchemy-migrate 将列类型从字符变化更改为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15229475/

相关文章:

python - YouTube API Python upload_video.py从脚本而不是命令行运行

sql - 其他用户能否闯入我的sql操作序列?

python - flask SQLalchemy : relationships between different modules

postgresql - 如何在 SQLAlchemy 中表达 JOIN 和 GROUP BY 查询?

python - 从表中选择数据在 SQLAlchemy 中抛出错误

python - Python 中的 MRO 未按预期工作

python - 部署到移动设备或台式计算机之间的 aws elastic beanstalk 的 django 网站有区别吗?

python - 使用高斯过程回归 (GPR) 预测 radio 信号强度 (RSS)

ruby-on-rails - Rails postgreSQL 重复键

ruby-on-rails - Gitlab 架构 - Rails Postgresql