Openstack数据库管理工具alembic更新Enum类型
在使用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类型相关推荐
- idea database 添加字段不更新_如何借助IDEA数据库管理工具可视化使用TDengine?
什么是IDEA Database管理工具? 这里首先介绍下IDEA,IDEA全称IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的Java开发工具之一. I ...
- Java开源数据库管理工具
SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...
- 数据库管理工具 FileMaker Pro 17 Advanced v17.0.4.400中文版
FileMaker Pro Advanced 17是一款目前市面上最方便的桌面数据库软件,是全球最畅销.最方便的桌面数据库软件,适用于 Windows 和 Mac 平台.FileMaker Pro是可 ...
- C代码工具--自动生成enum值和名字映射代码
这年头好像继续做C语言的人不多了,年轻人大多去互联网和移动应用.确实,那两个领域现在来钱快,且总是供不应求.就说刚刚在一个旧同事的微信群里,有人刚放出自己有团队可以做App几分钟,哇塞,好几个人说有项 ...
- Navicat Premium 12 for Mac(多重连接数据库管理工具)汉化破解版
本站第一时间为各位小伙伴带来最好的数据库管理工具Navicat Premium Mac全新汉化激活版!Navicat Premium for mac是一个可多重连接的数据库管理工具,Navicat的功 ...
- 数据库管理工具 Navicat 和 DBeaver
Navicat "Navicat" 是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL.Oracle.PostgreSQL.SQLite.SQL Server.Mari ...
- 在线数据库管理工具 web-db mongodb
文章目录 写在前面 体验地址 功能展示 登陆页面 双击查看数据 删除document 更新document 更新已有属性---需指定类型 删除字段 支持恢复 增加新字段 写在前面 起因: 平常连接数据 ...
- SQLPro Studio for Mac(可视化数据库管理工具)
SQLPro Studio for Mac是一款可视化数据库管理工具,为创建 MySQL, MSSQL, Oracle和Postgres连接提供支持的数据库管理解决方案,包括SSH隧道功能. SQLP ...
- Navicat Premium for Mac(数据库管理工具)15中文版
Navicat Premium for mac是一个可多重连接的数据库管理工具,Navicat的功能足以符合专业开发人员的所有需求,但是对数据库服务器的新手来说又相当容易学习.Navicat Prem ...
最新文章
- keepalived双实例配置
- 前端面试题及答案整理(一)
- wxWidgets:wxLocale类用法
- 去除android2.1移动设备3G图标
- Oracle 11g R2 X64数据库安装
- MicroPython-GPRS教程之TPYBoardv702GPRS功能测试
- Python中的计数(词频)
- python调用dos命令_基于Python执行dos命令并获取输出的结果
- DEDE中如何过滤掉Html标签,并且截取字符串长度
- 2021-06-28DOM节点插入
- TCP/IP源码分析
- Funcode-黄金矿工
- Opencv 实现 运动模糊的添加(motion blur)与消除(demotion blur)
- PHP面试技巧——如何处理与面试官持不同观点这个问题?
- uniapp 设置桌面角标
- 计算机进制转换专项训练,计算机进制转换练习题.doc
- Android中加速和位置传感器的使用
- CST shape tools
- filecoin space race
- 分享一个麻将听牌算法(带癞子)(Lua)
热门文章
- 中科院计算所关于“木兰”语言问题处理情况说明
- AR智能提升工业效率的4大场景与应用实践!
- 一文读懂计算计仿真技术
- 黄仁勋的“数据梦” 英伟达豪掷69亿美金虎口夺食
- 5G手机“狂奔而来”,业内预计明年二季度全面上市
- 百度CES大秀,Apollo2.0与DuerOS新产品背后的百度开放新姿态
- 面对大规模AI集成,企业为何迟迟犹豫?
- AlphaGo Zero的伟大与局限——ResNet作者、旷视研究院院长孙剑深度评述
- 字节跳动取消大小周后首次发薪,员工炸锅:薪资普降 17%
- 程序员如何做瑜伽? | 每日趣闻