摘要:當使用到后者這類微型框架時,根據業務場景不同,如果需要處理模型的建立升級和遷移的問題,可以考慮下接下來要介紹的和。這時候檢查數據庫,可以發現生成了張表,升級工作就完成了。而我在使用的實際項目中是操作的原生,異步類型的配合使用留待以后探究。
背景
Python的世界里有許多web框架:比如大而全的 Django, 提供了模型定義遷移,到路由處理,再到視圖的渲染等整套功能;比如小巧靈活的Flask, 雖然只包含了核心的請求處理內容,但卻可以通過安裝生態豐富的插件來完成大多數所需功能;比如面向ERP行業的Odoo, 除了基礎的MVC, 還提供了常用的進銷存和人力資源等模塊以及方便的web數據管理界面;比如以異步IO為特色的Sanic 和 Tonado, 提供了一套基于異步IO的請求處理方案;還有其他Bottle, Cherrypy, Pyramid 等。
這么多web框架其中一類是全套web解決方案的,像django,pyramid,odoo等,一類是提供路由和請求處理的"api"微型框架,像flask, sanic, bottle, cherrpy等。當使用到后者這類微型框架時,根據業務場景不同,如果需要處理模型的建立、升級和遷移的問題,可以考慮下接下來要介紹的sqlalchemy 和Alembic。
SQLAlchemy是python里的處理模ORM(模型關系映射)一套工具,可以通過直觀地通過定義python中的class來定義數據表結構,通過操作class的具體object來操作數據記錄。 Alembic是一套管理數據庫升降級的遷移工具,比如在實際業務場景中需要對已經定義好的模型進行增刪字段操作,可以通過alembic來對升降級進行方便地可控地操作。
SQLAlchemy和alembic的安裝和詳細配置可以參考官方文檔,這里我通過一個示例來說明如何實現model的定義和遷移。代碼地址在這里。
初始化和配置安裝python依賴(主要是SQLAlchemy和alembic):
pip install -r requirements.txt
初始化alembic:
alembic init YOUR_ALEMBIC_DIR
alembic會在根目錄創建 YOUR_ALEMBIC_DIR 目錄和 alembic.ini 文件,
所以在我的示例代碼里, alembic_dir 和 alembic.ini 是運行 alembic init alembic_dir 初始化創建的。
alembic.ini 文件 提供了一些基本的配置,比如數據庫的連接選項。
alembic_dir 的目錄結構和作用為:
$ tree alembic_dir alembic_dir ├── README ├── env.py # 每次執行Alembic都會加載這個模塊,主要提供項目Sqlalchemy Model 的連接 ├── script.py.mako # 遷移腳本生成模版 └── versions # 存放生成的遷移腳本目錄 1 directory, 4 files
接下來先來看看sqlalchemy里model的定義,在model目錄里:
$ tree . ├── __init__.py # 打包成一個模塊 ├── base.py # 定義所有模型繼承的Base類 ├── role.py # 定義“角色”模型 └── user.py # 定義“用戶”模型 0 directories, 4 files
其中,sqlalchemy的模型類繼承自一個由 declarative_base() 方法生成的類,所以在 base.py 里有如下兩行代碼:
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base()
模型定義完成后,我們需要告訴alembic去哪里找尋模型定義,所以在 alembic_dir/env.py 的21行左右可以看到指定:
# Custmosized import os import sys # 將當前目錄(項目更目錄)加入sys.path, 當然也可以將根目錄下的model加入sys.path,這樣就不需要將model封裝成模塊 sys.path.append(os.getcwd()) from model import Base target_metadata = Base.metadata
另外通常我們也改一下生成模板 script.py.mako ,加上編碼信息,否則在升級腳本中如果有中文會報錯,參見 alembic_dir/script.py.mako 的前兩行。
接下來需要配置alembic連接管理那個數據庫,在 alembic.ini 的第38行修改數據庫連接選項,這里代碼中采用本地的mysql為示例:
sqlalchemy.url = mysql://root:@localhost/test2運行
配置工作做完后,確保本地mysql服務啟動,并且有上面配置的數據庫后,讓我們來生成第一份遷移腳本, 在 sqlalchemy-alembic 目錄下運行:
# 其中 "First create user add role table" 是這次遷移腳本的備注,類似git commit的message alembic revision --autogenerate -m "First create user add role table"
運行完命令后,會發現在 sqlalchemy-alembic/alembic_dir/versions 下生成了一個遷移腳本,遷移腳本的主體是:
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 ###
可以發現,是根據model定義的內容,自帶生成的升級和降級代碼,實際項目中需要檢查一下升降級腳本是否有誤。
接下來,在項目根目錄下運行升級命令:
$ 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 表示升級到遷移腳本中最新的版本。
這時候檢查數據庫,可以發現生成了3張表,升級工作就完成了。
alembic_version # alembic用來追蹤目前數據庫表的版本的表,表的內容只有一行,為當前版本號,對應于升級腳本上的版本號 roles # 自動生成的表 user # 自動生成的表
接下來,如果對模型有其它改動,比如新增字段等,可以再次生成遷移腳本,檢查無誤后運行upgrade完成遷移動作。
其它alembic的遷移腳本也是可以自己手寫的,這樣不需要配置 env.py 里的 target_metadata ,每次遷移做的事完全有手動來決定對數據庫操作。
alembic的降級可以用類似 alembic downgrade -1 的命令, -1 代表降級到上個版本,也支持其他參數,具體可以查詢文檔。
sqlalchemy 可以以ORM的方式在業務邏輯處理的時候引用,這樣每次查詢到一條或多條數據,就可以得到一個或多個對象,類似于django的model。
在使用類似sanic這樣的異步框架時,需要注意orm的選取,是否需要一個異步的orm框架呢,可以考慮的異步orm可以參照這里 ,另外sqlalchemy的作者在15年對此有思考,這篇文章 可以看看。而我在使用sanic的實際項目中是操作的原生sql,異步io類型的orm配合使用留待以后探究。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41648.html
摘要:在實際項目中,這么做肯定是不行的實際項目中不會使用內存數據庫,這種數據庫一般只是在單元測試中使用。接下來,我們將會了解中單元測試的相關知識。 在上一篇文章,我們介紹了SQLAlchemy的基本概念,也介紹了基本的使用流程。本文我們結合webdemo這個項目來介紹如何在項目中使用SQLAlchemy。另外,我們還會介紹數據庫版本管理的概念和實踐,這也是OpenStack每個項目都需要做的...
摘要:命令需要注冊回調函數來將對象添加到導入列表。創建遷移腳本在,數據庫遷移工作由遷移腳本完成。函數實施數據庫更改,是遷移的一部分,函數則刪除它們。另一方面,自動遷移通過尋找模型定義和數據庫當前狀態間的不同為和生成代碼。 9、數據庫在視圖函數中的使用 在前面章節描述的數據庫操作是可以在視圖函數中直接使用的。示例5-5展示的新版本主頁實現了用戶輸入名字并保存到數據庫中。 示例5-5. he...
摘要:命令需要注冊回調函數來將對象添加到導入列表。創建遷移腳本在,數據庫遷移工作由遷移腳本完成。函數實施數據庫更改,是遷移的一部分,函數則刪除它們。另一方面,自動遷移通過尋找模型定義和數據庫當前狀態間的不同為和生成代碼。 9、數據庫在視圖函數中的使用 在前面章節描述的數據庫操作是可以在視圖函數中直接使用的。示例5-5展示的新版本主頁實現了用戶輸入名字并保存到數據庫中。 示例5-5. he...
摘要:是的一個數據庫工具,提供了強大的對象模型間的轉換,可以滿足絕大多數數據庫操作的需求,并且支持多種數據庫引擎,,等,在這里記錄基本用法和學習筆記一安裝通過安裝二使用首先是連接到數據庫,支持多個數據庫引擎,不同的數據庫引擎連接字符串不一樣,常用 SQLAlchemy是python的一個數據庫ORM工具,提供了強大的對象模型間的轉換,可以滿足絕大多數數據庫操作的需求,并且支持多種數據庫引擎(...
閱讀 2968·2021-10-15 09:41
閱讀 1625·2021-09-22 15:56
閱讀 2105·2021-08-10 09:43
閱讀 3278·2019-08-30 13:56
閱讀 1783·2019-08-30 12:47
閱讀 653·2019-08-30 11:17
閱讀 2774·2019-08-30 11:09
閱讀 2197·2019-08-29 16:19