4.alembic資料遷移工具
alembic是用來做ORM模型與資料庫的遷移與對映。alembic使用方式跟git有點類似,表現在兩個方面,第一個,alemibi的所有命令都是以alembic開頭;
第二,alembic的遷移檔案也是通過版本進行控制的。安裝方式:pip install alembic
1.1.alembic的使用
(1)定義模型
models.py
from sqlalchemy import Column,Integer,String,create_engine
from sqlalchemy.ext.declarative import declarative_base
DB_URI = "mysql+pymysql://root: [email protected]:3306/alembic_demo?charset=utf8"
engine = create_engine(DB_URI)
Base = declarative_base(engine)
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
username = Column(String(50),nullable=False)
(2)在cmd終端初始化,建立一個倉庫
alembic init learn_alembic
(3)修改配置檔案,指定連線的資料庫
alembic.ini
sqlalchemy.url = mysql+pymysql://root:[email protected]:3306/alembic_demo?charset=utf8
(4)將models所在的目錄路徑新增到env.py,並指定target_metadata
import sys,os
# 1.__file__:當前檔案(env.py)
#2.os.path.dirname(__file__):獲取當前檔案的目錄
#3.os.path.dirname(os.path.dirname(__file__)):獲取當前檔案目錄的上一級目錄
#4.sys.path: python尋找匯入的包的所有路徑
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import models
target_metadata = models.Base.metadata
(5)生成遷移指令碼
alembic revision --autogenerate -m "第一次提交"
(6)將生成的遷移指令碼對映到資料庫中
alembic upgrade head
以後如果想要新增或修改模型,重複5,6步驟即可
1.2.alembic常用命令和經典錯誤解決辦法
常用命令和引數解釋:
- init:建立一個alembic倉庫
- rebision:建立一個新的版本檔案
- --autogenerate:自動將當前模型的修改,生成遷移指令碼
- -m:本次遷移做了哪些修改
- upgrade:將指定版本的遷移檔案對映到資料庫中,會執行版本檔案中的upgrade函式
- head:代表當前的遷移指令碼的版本號
- downgrade:會執行指定版本的遷移檔案中的downgrade函式
- heads:展示當前可用的heads指令碼檔案
- history:列出所有的遷移版本及其資訊
- current:展示當前資料庫中的版本號
經典錯誤
1.FAILED:Target databases is not up to date.
原因:主要是heads和current不相同。current落後於heads的版本
解決辦法:將current移動到head上。alembic upgrade head
2.FAILED:Can't locate revision identified by 'xxxxxxx'
原因:資料庫中存的版本號不在遷移指令碼檔案中
解決辦法:刪除資料的alembic_version表中的資料,重新執行alembic upgrade head
1.3.current命令使用介紹
用alembic工具:資料庫中會自動生成一張表alembic_version
在資料庫中可以檢視當前的版本號
在cmd終端也可以通過current命令檢視
alembic current
1.4.Flask-SQLAlchemy下使用alembic
(1)config.py
DB_URI = "mysql+pymysql://root:[email protected]:3306/flask_alembic_demo?charset=utf8"
SQLALCHEMY_DATABASE_URI = DB_URI
(2)flask_alembic_demo.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(50),nullable=False)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
(3)初始化
alembic init alembic
(4)alembic.ini
sqlalchemy.url = mysql+pymysql://root:[email protected]:3306/flask_alembic_demo?charset=utf8
(5)env.py
import sys,os
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import flask_alembic_demo
#用的是db.Model
target_metadata = flask_alembic_demo.db.Model.metadata
(6)生成遷移指令碼
alembic revision --autogenerate -m "first commit"
(7)upgrade到資料庫
alembic upgrade head
(8)新增欄位
假入想新增一個欄位age
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(50),nullable=False)
age = db.Column(db.Integer)
重複步驟即可
alembic revision --autogenerate -m "add column age"
alembic upgrade head