Wil*_*ega 0 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')
Run Code Online (Sandbox Code Playgroud)
升级部分似乎工作,但降级总是失败并出现以下错误:
sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "number" cannot be cast to type integer
'\nALTER TABLE courses ALTER COLUMN number TYPE INTEGER' {}
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用普通的SQL我可以用ALTER TABLE courses ALTER COLUMN number TYPE INTEGER USING number::numeric改变从列式背character varying到integer,但我不知道该如何实现,使用SQLAlchemy的,迁移。
有没有办法强制 sqlalchemy 包含USING number::numeric在ALTER子句中?还是有另一种方法可以避免我上面发布的错误?
我感谢您的帮助。
看起来 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')
Run Code Online (Sandbox Code Playgroud)
顺便说一句,从 String 迁移到 Integer 可能会因不同原因而失败 - 当列值包含某些无法转换为数字的值时。因此,我会在应用程序逻辑中添加一些额外的验证,以便以后可以进行降级迁移。
| 归档时间: |
|
| 查看次数: |
9107 次 |
| 最近记录: |