sqlalchemy + alembic數據遷移

安裝用到的包

pip install pymysql

pip install sqlalchemy

pip install alembic

alembic和git類似,是一個版本控制的東西,執行它的命令,前面必須加alembic

寫一個py文件,創建一個表

from sqlalchemy import Column, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 連接數據庫
engine = create_engine('mysql+pymysql://root:[email protected]:3306/p2p')


Base = declarative_base()

class My_Table(Base):
    # 表名
    __tablename__ = 'RRDXinPlanList'

    # 字段
    id = Column(String(20), primary_key=True)
    amount = Column(String(20))
    earnInterest = Column(String(20))
    expectedYearRate = Column(String(20))
    fundsUseRate = Column(String(20))
    planId = Column(String(20))
    name = Column(String(20))
    status = Column(String(20))
    subpointCountActual = Column(String(20))

PlanList.metadata.create_all(engine)
DBSession = sessionmaker(bind=engine)

以上代碼執行後,就會創建數據表,接下來,我在逐行講解一下具體的內容分別是什麼,首先是引入了sessionmaker,Session的主要目的是建立與數據庫的會話,它維護你加載和關聯的所有數據庫對象。它是數據庫查詢(Query)的一個入口。

在Sqlalchemy中,數據庫的查詢操作是通過Query對象來實現的。而Session提供了創建Query對象的接口

在我們創建了My_Table這個類以後,我們使用了 .metadata.create_all()這個方法,並將engine作爲參數傳入(engine是連接數據庫的方法),你也可以直接使用父類Base的方式將多個表同時創建,例如Base.metadata.create_all(engine) 。 

接下來在來說My_Table 裏面的內容,自己創建類繼承自declarative_base()。在創建的時候,我們會默認給類加一個表名。(__tablename__)

alembic 初始化和配置

完成 pip 安裝之後

  • 在 shell 裏面 cd 到項目根目錄執行

alembic init alembic
  • 用 pycharm 把生成的文件 download 回來(包括 alembic 目錄和 alembic.ini

  • 修改 alembic.ini 設置數據庫連接。

sqlalchemy.url = driver://user:pass@localhost/dbname
  • env.py 中設置,將target_metadata賦值成數據庫的元數據(metadata)
    如果執行 revision 有 import 報錯,注意是否正確將當前項目目錄添加到 sys.path 路徑

# 修改:
target_metadata=None
# 修改爲:
# 方式1:
import os
import sys
root = os.path.dirname(__file__)+'/../../' # 定位到project根目錄
print root
sys.path.append(root)
from myapp import db
target_metadata = db.metadata

# 方式2:
import sys                                             
from os.path import abspath, dirname                   
sys.path.append(dirname(dirname(abspath(__file__))))   
from modules.models import Base                        
target_metadata = Base.metadata

基於數據庫 model 定義進行更新

將 model 定義好,並確認在 env.py 裏導入的 Base 類是在 model 定義的地方的

  • 配置完成執行( -m “註釋信息”,根據情況更改,會用到生成的py文件名字裏)

    alembic revision -m “create_user_table”

    這裏可以看到虛擬機目錄在 alembic/versions 裏生成了 py 文件,檢查確認更新的內容,然後執行

    alembic upgrade head

    這樣就會更新 mysql 數據庫了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章