Python使用Alembic框架进行数据库版本管理
数据库及ORM
alembic 版本管理
- 要使用alembic 首先要安装alembic 管理工具, 使用pip工具进行安装。会自动安装三个依赖包
pip install alembic
- 执行初始化会生成包括alembic.ini文件在内的一些文件。
其中:
alembic.ini 提供的是基本配置, 比如数据库连接的配置
env.py 每次执行alembic都会加载该模块,配置了SqlAlembic Models的连接
version 该目录下存放是在将来生成的版本
script.py.mako 迁移脚脚本生成模板在环境workspace中新建一个文件件, 然后在文件夹内执行:mkdir alembic_study cd alembic_study alembic init <the alembic_dic> ex: alembic init alembic
- 修改数据库连接,在此之前需要在环境上安装好数据库,并创建出自己的表
mysql -u root -p create database test_alembic; show databases;
例如现在是的数据库使用:test_alembic
则在alembic.ini中配置数据库连接, 用户名和密码根据实际情况进行定义。
- 在代码中创建Modules目录和models.py文件,如下所示:
models.py文件内容拷贝网上他人写好的模板即可
from sqlalchemy import Column, Integer, String, ForeignKey, Date, Table, Text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationshipBase = declarative_base()useridToRoleid = Table('useridToRoleid', Base.metadata,Column('userid', Integer, ForeignKey('users.id')),Column('roleid', Integer, ForeignKey('roles.id')),)roleidToIdentityid = Table('roleidToIdentityid', Base.metadata,Column('roleid', Integer, ForeignKey('roles.id')),Column('identityid', Integer, ForeignKey('identities.id')),)articleidToTagid = Table('articleidToTagid', Base.metadata,Column('articleid', Integer, ForeignKey('articles.id')),Column('tagid', Integer, ForeignKey('tags.id')),)class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)username = Column(String(32), nullable=False, unique=True)password = Column(String(32), nullable=False)email = Column(String(32), nullable=False, unique=True)roles = relationship('Role', secondary=useridToRoleid, backref='users')def __repr__(self):return "<%s users.username: %s>" % (self.id, self.username)class Role(Base):__tablename__ = 'roles'id = Column(Integer, primary_key=True)name = Column(String(16), nullable=False)identity = relationship('Identity', secondary=roleidToIdentityid, backref='roles')def __repr__(self):return "<%s roles.name: %s>" % (self.id, self.name)class Identity(Base):__tablename__ = 'identities'id = Column(Integer, primary_key=True)name = Column(String(16))def __repr__(self):return "<%s identities.name: %s>" % (self.id, self.name)class Category(Base):__tablename__ = "categories"id = Column(Integer, primary_key=True)name = Column(String(16), nullable=False)title = relationship('Article', backref='category')def __repr__(self):return "<%s categories.name: %s" % (self.id, self.name)class Tag(Base):__tablename__ = "tags"id = Column(Integer, primary_key=True)name = Column(String(16))def __repr__(self):return "<%s categories.name: %s" % (self.id, self.name)class Article(Base):__tablename__ = "articles"id = Column(Integer, primary_key=True)title = Column(String(50))description = Column(String(300))content = Column(Text)click_count = Column(Integer, default=0)category_id = Column(Integer, ForeignKey('categories.id'))tags = relationship('Tag', secondary=articleidToTagid, backref='articles')def __repr__(self):return "<%s categories.name: %s" % (self.id, self.title)
- 修改env.py配置文件,将target_metdata =None 替换掉
这样alembic就能获取自己项目中的models中定义的信息
- 在alembic.ini文件所在的路径先执行创建数据库版本的文件, alembic reversion -m "注释"
alembic revision --autogenerate -m "init the db"
生成如下所示:versions目录下生成一个文件,格式是:版本号_注释.py文件
- 变更数据库,如果修改了models.py中的表结构, 比如增加了新的字段
在user表中新增了一个telphone的字段。要经过两个步骤就可再生成一个version文件alembic upgrade head #每次要创建新的版本,需要执行数据库升级到新版本的命令,才能继续更新版本 alembic revision --autogenerate -m "add telphont for role"
- head 指的是最新版本,base指的是最初版本, 需要对数据库升级使用upgrade, 降级则使用downgrade
- 将数据库降级
降级到最初的版本alembic downgrade base
将数据库降级到执行版本: alembic downgrade 版本号
alembic downgrade 1234567890
- 查询当前版本号
在数据库中有一个alembic_version的字段,表示的是最后一个版本的版本号 - versions中的版本文件控制升级和降级
这是第一个version文件,所有只有revsion, 表示当前版本的版本号,没有父版本down_revison
对于刚才生成的第二个文件
这个version文件有父文件:down_revision, 即它是从哪个version文件升级过来的,指向的是它上一级的文件。
执行升级和降级就是通过revision和down_revision文件来实现的 - versions 内容
upgrade()表示该版本在升级的时候添加的内容,downgrade()表示该版本在回退时候要删除的内容
版本升级与回退问题
- 不同分支出现version文件反合的问题
Python使用Alembic框架进行数据库版本管理相关推荐
- 在线车辆推荐网 Python语言+Django框架+Mysql数据库 基于用户、物品的协同过滤推荐算法 开发在线汽车推荐系统 二手车网站推荐系统 分布式大数据、机器学习、人工智能开发
在线车辆推荐网 Python语言+Django框架+Mysql数据库 基于用户.物品的协同过滤推荐算法 开发在线汽车推荐系统 二手车网站推荐系统 分布式大数据.机器学习.人工智能开发 CarRecom ...
- 记录Python使用Django框架操作数据库遇到的问题与流程
** python学习使用Django框架连接mysql数据库的步骤和遇到的一些问题 ** 配置数据库: 项目的settings.py文件的77行修改如下: DATABASES = {'default ...
- python的flask框架mysql数据库迁移
最近在学习<flaskweb开发>,教程里采用 sqlite 数据库,我自己用的是mysql,在到数据库迁移部分有点懵了,想跳过去,但是到后面发现很不方便,于是折腾了好长时间,网上也找不到 ...
- python接口自动化测试框架链接数据库_python接口自动化测试框架实现之操作mysq数据库...
python操作mysql数据库需要使用到mysqlclient库. 安装:pip install mysqlclient python连接mysql数据库分以下步骤: 1.与mysql建立连接: 2 ...
- 使用alembic进行openstack数据库版本管理
在线更新 1. alembic init <YOUR_DIR># 此处,我用的是alembic_v 2.修改alembic.ini.如下: sqlalchemy.url = driver: ...
- 基于python+django框架+Mysql数据库的校园二手书籍交易系统设计与实现
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的校园二手书籍交易系统,整个网站项目使用了B/S架构,基于python的Django框架下开发:用户通过登录网站,查询二手交易商品 ...
- 基于python+django框架+Mysql数据库的在线电子书阅读系统设计与实现
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的电子书阅读系统,整个网站项目使用了B/S架构,基于python的Django框架下开发:管理员通过后台录入信息.管理信息,设置网 ...
- 基于python+django框架+Mysql数据库的跳蚤市场二手物品交易系统设计与实现
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的二手物品交易系统,整个网站项目使用了B/S架构,基于python的Django框架下开发:用户通过登录网站,查询二手交易商品,购 ...
- 基于python+django框架+Mysql数据库的多用户B2C商城平台系统设计与实现
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的多用户商城系统,整个网站项目使用了B/S架构,基于python的Django框架下开发:用户通过登录网站,查询商品,购买商品,下 ...
最新文章
- unity3d版本控制的设置方法(SVN)
- 吴裕雄--天生自然 HADOOP大数据分布式处理:修改CenterOS 7系统时间为北京时间
- 《剑指offer》c++版本 11. 旋转数组的最小数字
- css 倒三角_【译】改善 CSS 的 10 个最佳实践
- 四层交换机是什么?有什么用?与二层/三层交换机有何区别?
- Cpp 对象模型探索 / 静态联编和动态联编
- iToken----开发前准备
- linux板级初始化
- 提交表单数据到数据库_普通表单不仅适用于数据库
- [转]Linux下VSCode常用的快捷键
- 微信小程序下载图片保存到本地
- dell 2u服务器型号,IBM、HP、Dell比拼主流2U双路服务器
- 医院信息化建设(2)---医疗业务
- IOS逆向(9)DebugServer + LLDB
- Android下图片清晰度识别
- css中aspect,CSS属性之aspect-ratio
- 如何查看linux的日志
- 微信诞生8年了,但还有8亿人不懂微信聊天礼仪
- VSCODE配置C/C++
- zookeeper集群节点个数为什么最好是2n+1
热门文章
- 展晓凯:“零经验”的我与唱吧从零到四亿
- 计算机组成原理之CPU以及高速缓存
- 计算机组成原理复试面试问题
- 制冷与空调设备安装维修相关理论知识在线模拟考试题库
- 8通道1:2或2:1双向多路复用器/多路解复用器,GRANDMICRO有容微的ASW3810可以代完美替
- 手机上计算机功能,手机上有计算器的赶紧看看,这个功能不说很多人不知道,赶紧告诉身边人...
- STMCU中文官网发布了最新的云接入培训课件
- 2007年中国互联网网站市场表现研究报告
- 每月一书(202105):《原则》
- 禁止流氓软件开机自启