1. 程式人生 > >4.alembic資料遷移工具

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