摘要:當(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_dir 和 alembic.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
摘要:在實(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)目都需要做的...
摘要:命令需要注冊(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...
摘要:命令需要注冊(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...
摘要:是的一個(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ù)引擎(...
閱讀 2980·2021-10-15 09:41
閱讀 1637·2021-09-22 15:56
閱讀 2113·2021-08-10 09:43
閱讀 3291·2019-08-30 13:56
閱讀 1793·2019-08-30 12:47
閱讀 662·2019-08-30 11:17
閱讀 2781·2019-08-30 11:09
閱讀 2202·2019-08-29 16:19