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:123456@127.0.0.1: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:123456@127.0.0.1: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:123456@127.0.0.1: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:123456@127.0.0.1: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM