在使用alembic开发管理数据库时,会遇到一个比较麻烦的问题,就是变更某列的枚举类型,事实上使用sql命令变更相当的简单,一条alter的执行即可:

ALTER TYPE status ADD value 'output_limit_exceeded' after 'timed_out';
#删除
DROP TYPE status

但这样并不能满足alembic管理的初衷,也无法实现downgrade。

使用google搜索关键字“alembic enum type”,第一个出现的是stackflow的一个帖子Altering an Enum field using Alembic。

from alembic import opimport sqlalchemy as saold_options = ('nonexistent_executable', 'signal', 'success', 'timed_out')
new_options = sorted(old_options + ('output_limit_exceeded',))old_type = sa.Enum(*old_options, name='status')new_type = sa.Enum(*new_options, name='status')tmp_type = sa.Enum(*new_options, name='_status')tcr = sa.sql.table('testcaseresult',sa.Column('status', new_type, nullable=False))def upgrade():# Create a tempoary "_status" type, convert and drop the "old" typetmp_type.create(op.get_bind(), checkfirst=False)op.execute('ALTER TABLE testcaseresult ALTER COLUMN status TYPE _status'' USING status::text::_status')old_type.drop(op.get_bind(), checkfirst=False)# Create and convert to the "new" status typenew_type.create(op.get_bind(), checkfirst=False)op.execute('ALTER TABLE testcaseresult ALTER COLUMN status TYPE status'' USING status::text::status')tmp_type.drop(op.get_bind(), checkfirst=False)def downgrade():# Convert 'output_limit_exceeded' status into 'timed_out'op.execute(tcr.update().where(tcr.c.status==u'output_limit_exceeded').values(status='timed_out'))# Create a tempoary "_status" type, convert and drop the "new" typetmp_type.create(op.get_bind(), checkfirst=False)op.execute('ALTER TABLE testcaseresult ALTER COLUMN status TYPE _status'' USING status::text::_status')new_type.drop(op.get_bind(), checkfirst=False)# Create and convert to the "old" status typeold_type.create(op.get_bind(), checkfirst=False)op.execute('ALTER TABLE testcaseresult ALTER COLUMN status TYPE status'' USING status::text::status')tmp_type.drop(op.get_bind(), checkfirst=False)

这个方法提供了解决了问题,但稍显繁琐。我们可以做一下简单的封装,生成一个通用函数:

def upgrade_enum(table, column_name, enum_name, old_options, new_options):old_type = sa.Enum(*old_options, name=enum_name)new_type = sa.Enum(*new_options, name=enum_name)tmp_type = sa.Enum(*new_options, name="_" + enum_name)# Create a temporary type, convert and drop the "old" typetmp_type.create(op.get_bind(), checkfirst=False)op.execute(u'ALTER TABLE {0} ALTER COLUMN {1} TYPE _{2}'u' USING {1}::text::_{2}'.format(table,column_name,enum_name))old_type.drop(op.get_bind(), checkfirst=False)# Create and convert to the "new" typenew_type.create(op.get_bind(), checkfirst=False)op.execute(u'ALTER TABLE {0} ALTER COLUMN {1} TYPE {2}'u' USING {1}::text::{2}'.format(table,column_name,enum_name))tmp_type.drop(op.get_bind(), checkfirst=False)

这样就可以直接通过传参直接来执行升级或降级操作了。

操作环境:

 alembic-0.8.2
-bash-4.2$ psql --version
psql (PostgreSQL) 9.3.10

转载于:https://blog.51cto.com/qujunorz/1921663

Openstack数据库管理工具alembic更新Enum类型相关推荐

  1. idea database 添加字段不更新_如何借助IDEA数据库管理工具可视化使用TDengine?

    什么是IDEA Database管理工具? 这里首先介绍下IDEA,IDEA全称IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的Java开发工具之一. I ...

  2. Java开源数据库管理工具

    SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...

  3. 数据库管理工具 FileMaker Pro 17 Advanced v17.0.4.400中文版

    FileMaker Pro Advanced 17是一款目前市面上最方便的桌面数据库软件,是全球最畅销.最方便的桌面数据库软件,适用于 Windows 和 Mac 平台.FileMaker Pro是可 ...

  4. C代码工具--自动生成enum值和名字映射代码

    这年头好像继续做C语言的人不多了,年轻人大多去互联网和移动应用.确实,那两个领域现在来钱快,且总是供不应求.就说刚刚在一个旧同事的微信群里,有人刚放出自己有团队可以做App几分钟,哇塞,好几个人说有项 ...

  5. Navicat Premium 12 for Mac(多重连接数据库管理工具)汉化破解版

    本站第一时间为各位小伙伴带来最好的数据库管理工具Navicat Premium Mac全新汉化激活版!Navicat Premium for mac是一个可多重连接的数据库管理工具,Navicat的功 ...

  6. 数据库管理工具 Navicat 和 DBeaver

    Navicat "Navicat" 是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL.Oracle.PostgreSQL.SQLite.SQL Server.Mari ...

  7. 在线数据库管理工具 web-db mongodb

    文章目录 写在前面 体验地址 功能展示 登陆页面 双击查看数据 删除document 更新document 更新已有属性---需指定类型 删除字段 支持恢复 增加新字段 写在前面 起因: 平常连接数据 ...

  8. SQLPro Studio for Mac(可视化数据库管理工具)

    SQLPro Studio for Mac是一款可视化数据库管理工具,为创建 MySQL, MSSQL, Oracle和Postgres连接提供支持的数据库管理解决方案,包括SSH隧道功能. SQLP ...

  9. Navicat Premium for Mac(数据库管理工具)15中文版

    Navicat Premium for mac是一个可多重连接的数据库管理工具,Navicat的功能足以符合专业开发人员的所有需求,但是对数据库服务器的新手来说又相当容易学习.Navicat Prem ...

最新文章

  1. keepalived双实例配置
  2. 前端面试题及答案整理(一)
  3. wxWidgets:wxLocale类用法
  4. 去除android2.1移动设备3G图标
  5. Oracle 11g R2 X64数据库安装
  6. MicroPython-GPRS教程之TPYBoardv702GPRS功能测试
  7. Python中的计数(词频)
  8. python调用dos命令_基于Python执行dos命令并获取输出的结果
  9. DEDE中如何过滤掉Html标签,并且截取字符串长度
  10. 2021-06-28DOM节点插入
  11. TCP/IP源码分析
  12. Funcode-黄金矿工
  13. Opencv 实现 运动模糊的添加(motion blur)与消除(demotion blur)
  14. PHP面试技巧——如何处理与面试官持不同观点这个问题?
  15. uniapp 设置桌面角标
  16. 计算机进制转换专项训练,计算机进制转换练习题.doc
  17. Android中加速和位置传感器的使用
  18. CST shape tools
  19. filecoin space race
  20. 分享一个麻将听牌算法(带癞子)(Lua)

热门文章

  1. 中科院计算所关于“木兰”语言问题处理情况说明
  2. AR智能提升工业效率的4大场景与应用实践!
  3. 一文读懂计算计仿真技术
  4. 黄仁勋的“数据梦” 英伟达豪掷69亿美金虎口夺食
  5. 5G手机“狂奔而来”,业内预计明年二季度全面上市
  6. 百度CES大秀,Apollo2.0与DuerOS新产品背后的百度开放新姿态
  7. 面对大规模AI集成,企业为何迟迟犹豫?
  8. AlphaGo Zero的伟大与局限——ResNet作者、旷视研究院院长孙剑深度评述
  9. 字节跳动取消大小周后首次发薪,员工炸锅:薪资普降 17%
  10. 程序员如何做瑜伽? | 每日趣闻