博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用alembic进行数据库版本管理
阅读量:4495 次
发布时间:2019-06-08

本文共 4340 字,大约阅读时间需要 14 分钟。

Alembic简介:

SQLAlchemy是一款非常优秀的ORM框架,但是本身没有带数据库版本控制功能,这很不方便,进行开发过程中难免修改数据模型,添加一个表,修改一个字段,都需要手动修改的话就比较费事了,还不如不用SQLAlchemy呢。

在这里介绍一款SQLAlchemy作者写的数据库版本控制工具---Alembic。另外还有一个工具叫做SQLAlchemy-Migrate,在使用过程中感觉Alembic更为灵活。

安装alembic

$ pip3 install alembic

初始化

使用之前,先在项目根目录进行初始化。

$ alembic init alembic

初始化完成后,会生成一个alembic.ini配置文件及一个alembic目录。

 项目目录树

创建模型类

#!/usr/bin/env python                       # -*- coding:utf-8 -*-                      # File Name    : sb.py                      # Author       : hexm                       # Mail         : xiaoming.unix@gmail.com    # Created Time : 2017-03-29 20:03           from sqlalchemy import Column, Integer, String, ForeignKey, Date, Table, Textfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import relationshipBase = declarative_base()# 用户id对应角色id 多对多useridToRoleid = Table('useridToRoleid', Base.metadata,        Column('userid', Integer, ForeignKey('users.id')),        Column('roleid', Integer, ForeignKey('roles.id')),    )# 角色id对应权限id 多对多roleidToIdentityid = Table('roleidToIdentityid', Base.metadata,        Column('roleid', Integer, ForeignKey('roles.id')),        Column('identityid', Integer, ForeignKey('identities.id')),    )# 文章id和标签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)
modules/models.py

修改配置文件

修改alembic.ini配置文件,只修改数据库连接部分即可,

sqlalchemy.url = driver://user:pass@localhost:port/dbname

修改为

sqlalchemy.url = mysql+pymysql://root:@localhost/linux_study

修改alembic/env.py

target_metadata = None

修改为

import sys                                             from os.path import abspath, dirname                   sys.path.append(dirname(dirname(abspath(__file__))))   from modules.models import Base                        target_metadata = Base.metadata

 自动创建版本

使用alembic revision -m "注释" 创建数据库版本,上面我们修改了配置文件alembic/env.py,指定了target_metadata,这里可以使用--autogenerate参数自动生成迁移脚本。

$ alembic revision --autogenerate -m "initdb"

其他常用参数

更新数据库

$ alembic upgrade 版本号

更新到最新版

alembic upgrade head

降级数据库

$ alembic downgrade 版本号

更新到最初版

alembic downgrade head

离线更新(生成sql)

alembic upgrade 版本号 --sql > migration.sql

从特定起始版本生成sql

alembic upgrade 版本一:版本二 --sql > migration.sql

查询当前数据库版本号

查看alembic_version表。

清除所有版本

将versions删掉,并删除alembic_version表

 

转载于:https://www.cnblogs.com/xiaoming279/p/6641601.html

你可能感兴趣的文章
oracle11g忘记sys密码
查看>>
文件各种上传,离不开的表单
查看>>
mysql查询插入优化
查看>>
hadoop备战:yarn框架的搭建(mapreduce2)
查看>>
微信公众号开发模式开启总结
查看>>
pygame-KidsCanCode系列jumpy-part2-加速度与摩擦力
查看>>
[elk]logstash的grok匹配逻辑grok+date+mutate
查看>>
准备Android面试
查看>>
界面与后台逻辑完全分离,单例模式,接口
查看>>
redis安装及测试
查看>>
38-系统标准模块与第三方模块(1)
查看>>
[转]Android U 盘功能实现和分析
查看>>
dedecms织梦副栏目名称和链接调用
查看>>
iOS 离屏渲染学习笔记
查看>>
iOS Xib布局某些控件显示或隐藏<约束的修改>
查看>>
软件工程第一次作业
查看>>
乘法逆元+模的运算规则
查看>>
.net 实现微信公众平台的主动推送信息
查看>>
线程池ThreadPool详解
查看>>
宝石TD迷宫设计器
查看>>