使用alembic進行資料庫版本管理
Alembic簡介:
SQLAlchemy是一款非常優秀的ORM框架, 但是本身沒有戴資料庫版本控制功能, 這很不方便, 進行開發過程中難免修改資料模型, 新增一個表, 修改一個欄位, 都需要手動修改就比較費事. 在這裡介紹一款SQLAlchemy作者寫的資料庫版本控制工具–Alembic. 另外還有一個工具叫做AQLAlchemy-Migrate, 在使用過程中感覺Alembic更為靈活.
安裝alembic
pip install alembic
初始化
使用之前, 先在專案根目錄進行初始化.
alembic init alembic 初始化完成後, 會生成一個alembic.ini配置檔案及一個almebic目錄.
專案tree
建立模型
# coding=utf-8
from sqlalchemy import Column, Integer, String, ForeignKey, Date, Table, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = 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('identityid', Integer, ForeignKey('identities.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)
修改配置檔案
修改alembic.ini配置檔案, 只修改資料庫連線部分即可. 原:
sqlalchemy.url = driver://user:[email protected]:port/dbname
修改為:
pymysql連線方式
sqlalchemy.url = mysql + pymysql://root:@localhost/product
mysql-connector連線方式(依賴)
sqlalchemy.url = mysql+mysqlconnector://root:[email protected]:3306/rule_test
修改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表 alembic current
清楚所有版本
將versions刪除, 並刪除alembic_version表