1. 程式人生 > >使用alembic進行資料庫版本管理

使用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表