python FastApi實(shí)現(xiàn)數(shù)據(jù)表遷移流程詳解
啥是數(shù)據(jù)遷移
在我們平時(shí)的開(kāi)發(fā)過(guò)程中,經(jīng)常需要對(duì)一些數(shù)據(jù)進(jìn)行調(diào)整。一般會(huì)有以下幾種場(chǎng)景:
1.需要新的數(shù)據(jù)表
我們的接口自動(dòng)化平臺(tái)雖然已經(jīng)較為完善了,但難免會(huì)繼續(xù)迭代一些新的功能,假設(shè)我們需要做一個(gè)訂閱用例的功能。
大體想一下就可以知道,訂閱用例以后這個(gè)數(shù)據(jù)得持久化(即入庫(kù)),這樣我在查詢誰(shuí)訂閱了這條用例的時(shí)候,就能獲取到訂閱人,訂閱時(shí)間等數(shù)據(jù)。
這也就意味著我們需要一張訂閱表,里面至少得有訂閱人和訂閱的id,以及訂閱時(shí)間這3個(gè)要素。體現(xiàn)在數(shù)據(jù)庫(kù)通俗點(diǎn)說(shuō)就需要:
// 創(chuàng)建訂閱表, 后面的省略 create table...
由于業(yè)務(wù)的變動(dòng),導(dǎo)致新的數(shù)據(jù)表誕生。
2.需要對(duì)現(xiàn)有表結(jié)構(gòu)進(jìn)行調(diào)整
當(dāng)我們的訂閱表完成以后,有的同學(xué)就發(fā)現(xiàn)了,這個(gè)訂閱好像不能取消,所以我們此時(shí)可能需要一個(gè)新的字段: isValid
,這個(gè)字段用來(lái)判斷用戶是否取消訂閱了這個(gè)用例,如果我訂閱錯(cuò)了,或者嫌消息太多,想取消訂閱,那還是得滿足需求的。
包括新增字段/修改字段/刪除字段,這些都會(huì)對(duì)數(shù)據(jù)表產(chǎn)生影響,導(dǎo)致我們需要改動(dòng)數(shù)據(jù)庫(kù)。
回到ORM
我們目前采用sqlalchemy
作為我們的orm,如果只需要修改Python的Model類(操作字段就加在Model類里面操作)該多好。這樣的話,我們依然不需要去寫很基礎(chǔ)的sql語(yǔ)句,就能達(dá)到修改表結(jié)構(gòu)的目的。而這個(gè),就是我們今天要講的數(shù)據(jù)遷移。因?yàn)閿?shù)據(jù)需要發(fā)生變化,orm與數(shù)據(jù)庫(kù)的邏輯對(duì)不上號(hào)了,所以我們需要遷移。
遷移手段
目前市面上,關(guān)于Django(自帶orm)和Flask這塊都很成熟,django因?yàn)橛凶詭У膐rm顯得更牛逼,在manage.py里面自帶了migrate(遷移)的命令。
而我們今天要講的fastapi,由于不像django那么全面,所以我們采用alembic(sqlalchemy作者編寫)來(lái)幫助我們完成數(shù)據(jù)遷移操作。
如果你也用的fastapi+sqlalchemy,那我們就一起來(lái)耍耍i!
注: sqlalchemy
只自帶create_all(建立全部表)的功能
安裝alembic
大家采用虛擬環(huán)境和全局安裝都可以,我的建議是全局安裝,因?yàn)槲覀兛赡軙?huì)在多個(gè)項(xiàng)目使用它。
pip install alembic
初始化項(xiàng)目
我們?cè)趐ython項(xiàng)目的根目錄輸入以下命令:
alembic init alembic
alembic是我們剛才安裝的工具,init則是初始化的意思,后面的alembic則是遷移文件夾的名字,一般我們會(huì)默認(rèn)叫alembic
,以便于其他人一眼就知道是干嘛的。
修改alembic.ini
執(zhí)行完成之后你會(huì)發(fā)現(xiàn)根目錄多了個(gè)ini配置文件和alembic文件夾,我們需要稍微修改下配置文件:
將alembic.ini中的sqlalchemy.url改為你數(shù)據(jù)庫(kù)的jdbc連接地址,以我的為例:
修改alembic/env.py
首先我們找到里面的target_metadata變量,默認(rèn)是None。接著在target_metadata = None上方加入如下代碼:
import sys from os.path import abspath, dirname sys.path.append(dirname(dirname(abspath(__file__))))
然后我們需要引入我們的model目錄,由于在pity
里面,最后的初始化建表工作都是在curd目錄進(jìn)行的:
所以我這邊是引入crud里面的Base。這個(gè)Base是啥玩意呢?
我們使用sqlalchemy,都需要引入各種model,這些model最終都會(huì)被加入到Base.metadata,這樣sqlalchemy就知道你有哪些表需要處理了。
我們繼續(xù)修改env.py,也就是告訴alembic你有哪些數(shù)據(jù)表(上文說(shuō)的, 數(shù)據(jù)表都在Base.metadata)。
# 注意這個(gè)地方是要引入模型里面的Base,不是connect里面的 from app.crud import Base # 告訴alembic 你的表數(shù)據(jù)在哪 target_metadata = Base.metadata
開(kāi)始生成遷移工作
要注意,我們配置這么多東西是為了讓alembic知道你的model都在哪,你的數(shù)據(jù)庫(kù)怎么連,這樣它才能去對(duì)比差異并生成結(jié)果。
alembic revision --autogenerate -m "test"
稍作等待,我們可以在alembic/versions目錄看到對(duì)應(yīng)的py文件:
里面會(huì)有drop_column(刪除字段)這樣的操作信息。但要注意,這并沒(méi)有真正修改數(shù)據(jù)庫(kù)。
變更數(shù)據(jù)庫(kù)
alembic upgrade head
執(zhí)行上述命令,alembic就會(huì)根據(jù)你當(dāng)前的版本(應(yīng)該是你剛才生成的version的py腳本)去執(zhí)行數(shù)據(jù)庫(kù)變更操作。
這樣,一個(gè)簡(jiǎn)單的遷移工作就完成了。接著我們聊聊注意事項(xiàng)。
FAQ
Q. 版本py腳本無(wú)變更信息出現(xiàn)
A. 請(qǐng)檢查你的數(shù)據(jù)庫(kù)是否真有變更,檢查你的數(shù)據(jù)庫(kù)url是否正確,檢查你的model是否引入正確,如果操作都沒(méi)問(wèn)題,可以刪除alembic目錄和ini,重復(fù)上述操作(我昨晚就是這樣的)
Q. 為什么字段重命名沒(méi)有產(chǎn)生變更
A. 這玩意只校驗(yàn)了新增/修改/刪除字段,這里的修改指的是字段的nullable這種修改,所以改字段名它不會(huì)檢測(cè)。
Q. 我數(shù)據(jù)庫(kù)里面有表沒(méi)有定義到model,為啥變更給俺把表刪除了?
A. 這個(gè)問(wèn)題我也發(fā)現(xiàn)了,應(yīng)該是有什么配置可以配置不刪除未找到的表,但我目前還沒(méi)有去研究,有后續(xù)會(huì)在底部留言。
最后,這個(gè)玩意相對(duì)比較雞肋,建議不要大批量變更。可以頻率高一點(diǎn),比如有一點(diǎn)點(diǎn)改動(dòng)就用它變更一下,而不要在史詩(shī)級(jí)改動(dòng)的時(shí)候使用它。我個(gè)人的整體感受是,不太好用,但勉強(qiáng)能用。(因?yàn)闀簳r(shí)沒(méi)有發(fā)現(xiàn)更合適的)
到此這篇關(guān)于python FastApi實(shí)現(xiàn)數(shù)據(jù)表遷移流程詳解的文章就介紹到這了,更多相關(guān)python數(shù)據(jù)表遷移內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)簡(jiǎn)易版學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易版學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06Numpy數(shù)據(jù)類型轉(zhuǎn)換astype,dtype的方法
今天小編就為大家分享一篇Numpy數(shù)據(jù)類型轉(zhuǎn)換astype,dtype的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python 中使用 Selenium 單擊網(wǎng)頁(yè)按鈕功能
Selenium是一個(gè)用于測(cè)試網(wǎng)站的自動(dòng)化測(cè)試工具,支持各種瀏覽器包括Chrome、Firefox、Safari等主流界面瀏覽器,同時(shí)也支持phantomJS無(wú)界面瀏覽器,本篇文章將介紹如何在 Python 中使用 selenium 單擊網(wǎng)頁(yè)上的按鈕,感興趣的朋友一起看看吧2023-11-11Python學(xué)習(xí)之隨機(jī)模塊random詳解
本文我們將學(xué)習(xí)一下Python中非常簡(jiǎn)單但也非常有用的模塊—random ,此模塊主要用于生成隨機(jī)數(shù),接下來(lái)就讓我們了解一下random模塊中最常見(jiàn)的幾種方法吧2022-03-03python實(shí)現(xiàn)sublime3的less編譯插件示例
這篇文章主要介紹了python實(shí)現(xiàn)sublime3的less編譯插件示例的相關(guān)資料2014-04-04