成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Python數(shù)據(jù)模型構(gòu)建和遷移方案:SQLAlchemy&Alembic

李增田 / 1975人閱讀

摘要:當(dāng)使用到后者這類(lèi)微型框架時(shí),根據(jù)業(yè)務(wù)場(chǎng)景不同,如果需要處理模型的建立升級(jí)和遷移的問(wèn)題,可以考慮下接下來(lái)要介紹的和。這時(shí)候檢查數(shù)據(jù)庫(kù),可以發(fā)現(xiàn)生成了張表,升級(jí)工作就完成了。而我在使用的實(shí)際項(xiàng)目中是操作的原生,異步類(lèi)型的配合使用留待以后探究。

背景

Python的世界里有許多web框架:比如大而全的 Django, 提供了模型定義遷移,到路由處理,再到視圖的渲染等整套功能;比如小巧靈活的Flask, 雖然只包含了核心的請(qǐng)求處理內(nèi)容,但卻可以通過(guò)安裝生態(tài)豐富的插件來(lái)完成大多數(shù)所需功能;比如面向ERP行業(yè)的Odoo, 除了基礎(chǔ)的MVC, 還提供了常用的進(jìn)銷(xiāo)存和人力資源等模塊以及方便的web數(shù)據(jù)管理界面;比如以異步IO為特色的Sanic 和 Tonado, 提供了一套基于異步IO的請(qǐng)求處理方案;還有其他Bottle, Cherrypy, Pyramid 等。

這么多web框架其中一類(lèi)是全套web解決方案的,像django,pyramid,odoo等,一類(lèi)是提供路由和請(qǐng)求處理的"api"微型框架,像flask, sanic, bottle, cherrpy等。當(dāng)使用到后者這類(lèi)微型框架時(shí),根據(jù)業(yè)務(wù)場(chǎng)景不同,如果需要處理模型的建立、升級(jí)和遷移的問(wèn)題,可以考慮下接下來(lái)要介紹的sqlalchemy 和Alembic。

SQLAlchemy是python里的處理模ORM(模型關(guān)系映射)一套工具,可以通過(guò)直觀地通過(guò)定義python中的class來(lái)定義數(shù)據(jù)表結(jié)構(gòu),通過(guò)操作class的具體object來(lái)操作數(shù)據(jù)記錄。 Alembic是一套管理數(shù)據(jù)庫(kù)升降級(jí)的遷移工具,比如在實(shí)際業(yè)務(wù)場(chǎng)景中需要對(duì)已經(jīng)定義好的模型進(jìn)行增刪字段操作,可以通過(guò)alembic來(lái)對(duì)升降級(jí)進(jìn)行方便地可控地操作。

SQLAlchemy和alembic的安裝和詳細(xì)配置可以參考官方文檔,這里我通過(guò)一個(gè)示例來(lái)說(shuō)明如何實(shí)現(xiàn)model的定義和遷移。代碼地址在這里。

初始化和配置

安裝python依賴(lài)(主要是SQLAlchemy和alembic):

pip install -r requirements.txt

初始化alembic:

alembic init YOUR_ALEMBIC_DIR

alembic會(huì)在根目錄創(chuàng)建 YOUR_ALEMBIC_DIR 目錄和 alembic.ini 文件,
所以在我的示例代碼里, alembic_diralembic.ini 是運(yùn)行 alembic init alembic_dir 初始化創(chuàng)建的。

alembic.ini 文件 提供了一些基本的配置,比如數(shù)據(jù)庫(kù)的連接選項(xiàng)。

alembic_dir 的目錄結(jié)構(gòu)和作用為:

$ tree alembic_dir

alembic_dir
├── README
├── env.py          # 每次執(zhí)行Alembic都會(huì)加載這個(gè)模塊,主要提供項(xiàng)目Sqlalchemy Model 的連接
├── script.py.mako  # 遷移腳本生成模版
└── versions        # 存放生成的遷移腳本目錄

1 directory, 4 files

接下來(lái)先來(lái)看看sqlalchemy里model的定義,在model目錄里:

$ tree
.
├── __init__.py # 打包成一個(gè)模塊
├── base.py     # 定義所有模型繼承的Base類(lèi)
├── role.py     # 定義“角色”模型
└── user.py     # 定義“用戶”模型

0 directories, 4 files

其中,sqlalchemy的模型類(lèi)繼承自一個(gè)由 declarative_base() 方法生成的類(lèi),所以在 base.py 里有如下兩行代碼:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

模型定義完成后,我們需要告訴alembic去哪里找尋模型定義,所以在 alembic_dir/env.py 的21行左右可以看到指定:

# Custmosized
import os
import sys
# 將當(dāng)前目錄(項(xiàng)目更目錄)加入sys.path, 當(dāng)然也可以將根目錄下的model加入sys.path,這樣就不需要將model封裝成模塊
sys.path.append(os.getcwd())
from model import Base
target_metadata = Base.metadata

另外通常我們也改一下生成模板 script.py.mako ,加上編碼信息,否則在升級(jí)腳本中如果有中文會(huì)報(bào)錯(cuò),參見(jiàn) alembic_dir/script.py.mako 的前兩行。

接下來(lái)需要配置alembic連接管理那個(gè)數(shù)據(jù)庫(kù),在 alembic.ini 的第38行修改數(shù)據(jù)庫(kù)連接選項(xiàng),這里代碼中采用本地的mysql為示例:

sqlalchemy.url = mysql://root:@localhost/test2
運(yùn)行

配置工作做完后,確保本地mysql服務(wù)啟動(dòng),并且有上面配置的數(shù)據(jù)庫(kù)后,讓我們來(lái)生成第一份遷移腳本, 在 sqlalchemy-alembic 目錄下運(yùn)行:

# 其中 "First create user add role table" 是這次遷移腳本的備注,類(lèi)似git commit的message
alembic revision --autogenerate -m "First create user add role table"

運(yùn)行完命令后,會(huì)發(fā)現(xiàn)在 sqlalchemy-alembic/alembic_dir/versions 下生成了一個(gè)遷移腳本,遷移腳本的主體是:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table("roles",
    sa.Column("id", sa.Integer(), nullable=False),
    sa.Column("name", sa.String(), nullable=True),
    sa.PrimaryKeyConstraint("id")
    )
    op.create_table("user",
    sa.Column("id", sa.Integer(), nullable=False),
    sa.Column("username", sa.VARCHAR(length=32), nullable=True),
    sa.Column("password", sa.VARCHAR(length=32), nullable=True),
    sa.Column("email", sa.VARCHAR(length=32), nullable=True),
    sa.PrimaryKeyConstraint("id")
    )
    op.create_index("ix_email_pwd", "user", ["email", "password"], unique=False)
    op.create_index("ix_user_pwd", "user", ["username", "password"], unique=False)
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index("ix_user_pwd", table_name="user")
    op.drop_index("ix_email_pwd", table_name="user")
    op.drop_table("user")
    op.drop_table("roles")
    # ### end Alembic commands ###

可以發(fā)現(xiàn),是根據(jù)model定義的內(nèi)容,自帶生成的升級(jí)和降級(jí)代碼,實(shí)際項(xiàng)目中需要檢查一下升降級(jí)腳本是否有誤。

接下來(lái),在項(xiàng)目根目錄下運(yùn)行升級(jí)命令:

$ alembic upgrade head

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 8deb154aaaa3, First create user add role table

其中 head 表示升級(jí)到遷移腳本中最新的版本。

這時(shí)候檢查數(shù)據(jù)庫(kù),可以發(fā)現(xiàn)生成了3張表,升級(jí)工作就完成了。

alembic_version  # alembic用來(lái)追蹤目前數(shù)據(jù)庫(kù)表的版本的表,表的內(nèi)容只有一行,為當(dāng)前版本號(hào),對(duì)應(yīng)于升級(jí)腳本上的版本號(hào)
roles            # 自動(dòng)生成的表
user             # 自動(dòng)生成的表

接下來(lái),如果對(duì)模型有其它改動(dòng),比如新增字段等,可以再次生成遷移腳本,檢查無(wú)誤后運(yùn)行upgrade完成遷移動(dòng)作。

其它

alembic的遷移腳本也是可以自己手寫(xiě)的,這樣不需要配置 env.py 里的 target_metadata ,每次遷移做的事完全有手動(dòng)來(lái)決定對(duì)數(shù)據(jù)庫(kù)操作。

alembic的降級(jí)可以用類(lèi)似 alembic downgrade -1 的命令, -1 代表降級(jí)到上個(gè)版本,也支持其他參數(shù),具體可以查詢(xún)文檔。

sqlalchemy 可以以O(shè)RM的方式在業(yè)務(wù)邏輯處理的時(shí)候引用,這樣每次查詢(xún)到一條或多條數(shù)據(jù),就可以得到一個(gè)或多個(gè)對(duì)象,類(lèi)似于django的model。

在使用類(lèi)似sanic這樣的異步框架時(shí),需要注意orm的選取,是否需要一個(gè)異步的orm框架呢,可以考慮的異步orm可以參照這里 ,另外sqlalchemy的作者在15年對(duì)此有思考,這篇文章 可以看看。而我在使用sanic的實(shí)際項(xiàng)目中是操作的原生sql,異步io類(lèi)型的orm配合使用留待以后探究。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41648.html

相關(guān)文章

  • 通過(guò)demo學(xué)習(xí)OpenStack開(kāi)發(fā)所需的基礎(chǔ)知識(shí) -- 數(shù)據(jù)庫(kù)(2)

    摘要:在實(shí)際項(xiàng)目中,這么做肯定是不行的實(shí)際項(xiàng)目中不會(huì)使用內(nèi)存數(shù)據(jù)庫(kù),這種數(shù)據(jù)庫(kù)一般只是在單元測(cè)試中使用。接下來(lái),我們將會(huì)了解中單元測(cè)試的相關(guān)知識(shí)。 在上一篇文章,我們介紹了SQLAlchemy的基本概念,也介紹了基本的使用流程。本文我們結(jié)合webdemo這個(gè)項(xiàng)目來(lái)介紹如何在項(xiàng)目中使用SQLAlchemy。另外,我們還會(huì)介紹數(shù)據(jù)庫(kù)版本管理的概念和實(shí)踐,這也是OpenStack每個(gè)項(xiàng)目都需要做的...

    mingzhong 評(píng)論0 收藏0
  • Flask Web Development —— 數(shù)據(jù)庫(kù)(下)

    摘要:命令需要注冊(cè)回調(diào)函數(shù)來(lái)將對(duì)象添加到導(dǎo)入列表。創(chuàng)建遷移腳本在,數(shù)據(jù)庫(kù)遷移工作由遷移腳本完成。函數(shù)實(shí)施數(shù)據(jù)庫(kù)更改,是遷移的一部分,函數(shù)則刪除它們。另一方面,自動(dòng)遷移通過(guò)尋找模型定義和數(shù)據(jù)庫(kù)當(dāng)前狀態(tài)間的不同為和生成代碼。 9、數(shù)據(jù)庫(kù)在視圖函數(shù)中的使用 在前面章節(jié)描述的數(shù)據(jù)庫(kù)操作是可以在視圖函數(shù)中直接使用的。示例5-5展示的新版本主頁(yè)實(shí)現(xiàn)了用戶輸入名字并保存到數(shù)據(jù)庫(kù)中。 示例5-5. he...

    jone5679 評(píng)論0 收藏0
  • Flask Web Development —— 數(shù)據(jù)庫(kù)(下)

    摘要:命令需要注冊(cè)回調(diào)函數(shù)來(lái)將對(duì)象添加到導(dǎo)入列表。創(chuàng)建遷移腳本在,數(shù)據(jù)庫(kù)遷移工作由遷移腳本完成。函數(shù)實(shí)施數(shù)據(jù)庫(kù)更改,是遷移的一部分,函數(shù)則刪除它們。另一方面,自動(dòng)遷移通過(guò)尋找模型定義和數(shù)據(jù)庫(kù)當(dāng)前狀態(tài)間的不同為和生成代碼。 9、數(shù)據(jù)庫(kù)在視圖函數(shù)中的使用 在前面章節(jié)描述的數(shù)據(jù)庫(kù)操作是可以在視圖函數(shù)中直接使用的。示例5-5展示的新版本主頁(yè)實(shí)現(xiàn)了用戶輸入名字并保存到數(shù)據(jù)庫(kù)中。 示例5-5. he...

    fasss 評(píng)論0 收藏0
  • sqlalchemy學(xué)習(xí)筆記

    摘要:是的一個(gè)數(shù)據(jù)庫(kù)工具,提供了強(qiáng)大的對(duì)象模型間的轉(zhuǎn)換,可以滿足絕大多數(shù)數(shù)據(jù)庫(kù)操作的需求,并且支持多種數(shù)據(jù)庫(kù)引擎,,等,在這里記錄基本用法和學(xué)習(xí)筆記一安裝通過(guò)安裝二使用首先是連接到數(shù)據(jù)庫(kù),支持多個(gè)數(shù)據(jù)庫(kù)引擎,不同的數(shù)據(jù)庫(kù)引擎連接字符串不一樣,常用 SQLAlchemy是python的一個(gè)數(shù)據(jù)庫(kù)ORM工具,提供了強(qiáng)大的對(duì)象模型間的轉(zhuǎn)換,可以滿足絕大多數(shù)數(shù)據(jù)庫(kù)操作的需求,并且支持多種數(shù)據(jù)庫(kù)引擎(...

    YPHP 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<