语言:python
数据库:mysql

1.背景介绍
在开发产品时,经常会用到数据库,但是随着版本的迭代升级,有可能数据库中的某些字段需要进行修改,甚至加入新字段,删除老字段。上述过程就称之为数据库迁移,本文介绍如何使用sqlalchemy-migrate进行数据库迁移
2.前提准备
首先本文假定你会使用python和sqlalchemy进行mysql数据库的操作。如下是一个简单的创建表的案例

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String
from storage_grpc.utils.global_data import GlobalDatadb = "mysql+pymysql://{user}:{password}@{host}:{port}/{db}".format(user=GlobalData().mysql_user,password=GlobalData().mysql_password,host=GlobalData().mysql_host,port=int(GlobalData().mysql_port),db=GlobalData().mysql_db)
engine = create_engine(db)
Base = declarative_base(engine)class Poo(Base):__tablename__ = 'poo'poo = Column(String(128), primary_key=True, unique=True)capa = Column(String(128), nullable=True)mou = Column(String(128), nullable=True)ded = Column(String(128), nullable=True)de = Column(String(128), nullable=True)if __name__ == '__main__':Base.metadata.create_all()

3.sqlalchemy-migrate迁移概念说明
a.首先需要建立一个“repo”(呈现为一个文件夹,作用是储存迁移过程中的各种脚本)
b.然后将“repo”和mysql数据库关联(关联之后相当于“repo”可以对mysql进行版本控制),所谓的版本控制其实就是迁移过程,每次迁移过程可以理解为一次版本升级
c.然后创建迁移脚本(命名为固定格式如:001_migra.py,下划线之前为版本号,必须是三位数,不足前面补0,下划线后面是自定义的)
d.将迁移脚本放置固定位置,执行升级(迁移)
4.开始实践,首先进行repo创建

from migrate.versioning import api
if __name__ == '__main__':repo = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'db_repository')if not os.path.exists(repo):api.create(repo, 'database repository')

from migrate就是sqlalchemy-migrate库,repo其实就是路径,可以自定义,但是上述的方法可以随代码在不同地方执行而变动,很方便。调用api.create为固定用法,记住就好。 'database repository’为你的“repo”的名字,可以自定义
5.将“repo”和数据库关联

api.version_control(db, repo)

从调用的函数名能看出来,其实就是用repo对数据库进行版本控制
6.创建迁移脚本
这部相对复杂

    migration = repo + '/versions/%03d_migration.py' % (api.db_version(db, repo) + 1)open(migration, 'wt').write(script)

首先创建文件名,migration,其中用到api.db_version来获取当前“repo”的版本号,这样在后面加1就是最新版本文件名,其中%03d表示3位数,不足补0
然后创建script脚本,将其写入migration。script创建如下

    old_model = api.create_model(db, repo)import typesnew = types.ModuleType('old_model')exec(old_model, new.__dict__)script = api.make_update_script_for_model(db, repo, new.meta,Base.metadata)print(script)

这里使用了一个函数api.make_update_script_for_model,这个函数通过导入旧模块new.meta和新模块Base.metadata来创建升级脚本。模块可以理解为数据库的结构。其中旧模块是通过api.create_model获取当前数据库的结构,新模块其实就是你代码中当前的结构Base.metadata。函数api.make_update_script_for_model通过对比两者的差异自动生成脚本script,你可以打印出来看一下便于理解。
然后你就获得了migration文件,并放在了你的“repo”里面
7.执行升级

    api.upgrade(db, repo)

如果你的数据库的结构和代码中的不一致,执行之后,就会自动升级了
8.总结
本文借鉴了很多其他的相关文章,但是由于其中代码太老,有很多错误,就不贴链接误导大家了。整体代码放在最后,仅供参考
提醒:修改表不是随便修改的,例如元素的类型不能修改,名字可以修改,元素可以新增可以删除,好像primary_key也不能增加。如果执行upgrade时报错,多半是修改的内容有问题

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String
from storage_grpc.utils.global_data import GlobalData
import os
from migrate.versioning import apidb = "mysql+pymysql://{user}:{password}@{host}:{port}/{db}".format(user=GlobalData().mysql_user,password=GlobalData().mysql_password,host=GlobalData().mysql_host,port=int(GlobalData().mysql_port),db=GlobalData().mysql_db)
engine = create_engine(db)
Base = declarative_base(engine)class Poo(Base):__tablename__ = 'poo'poo = Column(String(128), primary_key=True, unique=True)capa = Column(String(128), nullable=True)mou = Column(String(128), nullable=True)ded = Column(String(128), nullable=True)de = Column(String(128), nullable=True)if __name__ == '__main__':Base.metadata.create_all()repo = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'db_repository')if not os.path.exists(repo):api.create(repo, 'database repository')api.version_control(db, repo)migration = repo + '/versions/%03d_migration.py' % (api.db_version(db, repo) + 1)old_model = api.create_model(db, repo)import typesnew = types.ModuleType('old_model')exec(old_model, new.__dict__)script = api.make_update_script_for_model(db, repo, new.meta,Base.metadata)print(script)open(migration, 'wt').write(script)api.upgrade(db, repo)

sqlalchemy-migrate数据库迁移教学相关推荐

  1. php think migrate,thinkphp5 migrate数据库迁移使用详解

    这次给大家带来thinkphp5 migrate数据库迁移使用详解,thinkphp5 migrate数据库迁移使用的注意事项有哪些,下面就是实战案例,一起来看一下. tp5相对与tp3.2有很大的不 ...

  2. yii2 migrate 数据库迁移的简单分享

    开发中经常会用到的方法小结: 1../yii migrate xxx_xx 在表中插入某字段 : public function up(){$this->addColumn('{{applica ...

  3. Flask——migrate实现数据库迁移

    migrate实现数据库迁移的指令如下: 指令 代码 说明 初始化 python 文件名.py db init 这个命令会创建migrations文件夹,所有迁移文件都放在里面 创建迁移脚本 pyth ...

  4. django 数据库迁移(migrate)

    首先数据库迁移的两大命令: python manage.py makemigrations & python manage.py migrate 前者是将model层转为迁移文件migrati ...

  5. db migrate mysql_数据库迁移方案 node-db-migrate

    安装必要的库,这里使用的是mysql的迁移,所以除了db-migrate还需要db-migrate-mysql npm install -g db-migrate npm install db-mig ...

  6. 简单分析Flask 数据库迁移详情

    本文给大家分享的是 Flask 数据库迁移详情,db.create_all()不会重新创建表或是更新表,需要先使用db.drop_all()删除数据库中所有的表之后再调用db.create_all() ...

  7. flask数据库迁移理解及命令

    前言: 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表.就是将关系型数据库的一张张表转化成了Python的一个个类. 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库, ...

  8. 【Python】Flask框架系列(四):Flask-Migrate数据库迁移

    参考:flask数据库迁移理解及命令 Flask-Migrate 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表.就是将关系型数据库的一张张表转化成了Python的一个个类. 在开发 ...

  9. Web框架——Flask系列之数据库迁移(二十)

    一.Flask-Migrate扩展 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模 ...

最新文章

  1. 目标检测--Feature Pyramid Networks for Object Detection
  2. 大数据与数据挖掘考试题_大数据时代下的数据挖掘试题及答案
  3. Oracle 11g必须开启的服务及服务详细介绍
  4. 千里之行,始于足下。职场人士必读的寓言
  5. [转帖]2015年时微软Win3.1崩溃迫使巴黎奥利机场短暂关闭
  6. 送书 | 推荐一个可能是最全的Venn图一站式绘制工具
  7. jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等
  8. Node.js怎么处理数据库中日期类型
  9. luogu p1799 数列_NOI导刊2010提高(06)
  10. 解决办法:RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96
  11. 关于使用weex开发app上线App Store问题
  12. 实对称矩阵的特征值求法_对称矩阵、对角矩阵与三角矩阵
  13. 英文java简历模板下载_java英文简历模板
  14. 灰色预测的MATLAB代码
  15. Nginx(4)之搭建图片服务器
  16. 所有最好的Google幻灯片键盘快捷键
  17. 计算机软件标杆企业,张军平老师—人工智能专家,复旦大学教授,博士生导师,中国计算机协会人工智能专委会委员,软件学报和自动化学报责任编辑...
  18. ISO26262标准概览
  19. 煽情的儿子101=随笔
  20. 北航王田苗教授:国内外机器人发展热点与趋势(精华版)

热门文章

  1. 学习日记1/5今天不是个好日子
  2. 计算机相关书单汇总:基础、理论、网络、编码、C/C++、其他编程语言
  3. Echarts绘制乡镇地图方法心得
  4. atm c语言流程图_C语言 ATM自动存取款机全套代码
  5. LOAM系列——FLOAM配置、安装、问题解决及VLP16测试效果(完结版)
  6. 弘辽科技:小伙退伍网上创业卖特产,教你免费如何开淘宝网店
  7. js:js中加载js文件
  8. linux下将qt打包为可执行文件
  9. Python下借助百度翻译API制作一个翻译pdf的小工具-01
  10. 双塔服务器做什么系统比较好,搭建一台真正的 All in One Home Server 篇六:HomeServer 怎么能少了群晖(完结篇)...