<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在我們平時的開發過程中,經常需要對一些資料進行調整。一般會有以下幾種場景:
我們的介面自動化平臺雖然已經較為完善了,但難免會繼續迭代一些新的功能,假設我們需要做一個訂閱用例的功能。
大體想一下就可以知道,訂閱用例以後這個資料得持久化(即入庫),這樣我在查詢誰訂閱了這條用例的時候,就能獲取到訂閱人,訂閱時間等資料。
這也就意味著我們需要一張訂閱表,裡面至少得有訂閱人和訂閱的id,以及訂閱時間這3個要素。體現在資料庫通俗點說就需要:
// 建立訂閱表, 後面的省略 create table...
由於業務的變動,導致新的資料表誕生。
當我們的訂閱表完成以後,有的同學就發現了,這個訂閱好像不能取消,所以我們此時可能需要一個新的欄位: isValid
,這個欄位用來判斷使用者是否取消訂閱了這個用例,如果我訂閱錯了,或者嫌訊息太多,想取消訂閱,那還是得滿足需求的。
包括新增欄位/修改欄位/刪除欄位,這些都會對資料表產生影響,導致我們需要改動資料庫。
我們目前採用sqlalchemy
作為我們的orm,如果只需要修改Python的Model類(操作欄位就加在Model類裡面操作)該多好。這樣的話,我們依然不需要去寫很基礎的sql語句,就能達到修改表結構的目的。而這個,就是我們今天要講的資料遷移。因為資料需要發生變化,orm與資料庫的邏輯對不上號了,所以我們需要遷移。
目前市面上,關於Django(自帶orm)和Flask這塊都很成熟,django因為有自帶的orm顯得更牛逼,在manage.py裡面自帶了migrate(遷移)的命令。
而我們今天要講的fastapi,由於不像django那麼全面,所以我們採用alembic(sqlalchemy作者編寫)來幫助我們完成資料遷移操作。
如果你也用的fastapi+sqlalchemy,那我們就一起來耍耍i!
注: sqlalchemy
只自帶create_all(建立全部表)的功能
大家採用虛擬環境和全域性安裝都可以,我的建議是全域性安裝,因為我們可能會在多個專案使用它。
pip install alembic
我們在python專案的根目錄輸入以下命令:
alembic init alembic
alembic是我們剛才安裝的工具,init則是初始化的意思,後面的alembic則是遷移資料夾的名字,一般我們會預設叫alembic
,以便於其他人一眼就知道是幹嘛的。
執行完成之後你會發現根目錄多了個ini組態檔和alembic資料夾,我們需要稍微修改下組態檔:
將alembic.ini中的sqlalchemy.url改為你資料庫的jdbc連線地址,以我的為例:
首先我們找到裡面的target_metadata變數,預設是None。接著在target_metadata = None上方加入如下程式碼:
import sys from os.path import abspath, dirname sys.path.append(dirname(dirname(abspath(__file__))))
然後我們需要引入我們的model目錄,由於在pity
裡面,最後的初始化建表工作都是在curd目錄進行的:
所以我這邊是引入crud裡面的Base。這個Base是啥玩意呢?
我們使用sqlalchemy,都需要引入各種model,這些model最終都會被加入到Base.metadata,這樣sqlalchemy就知道你有哪些表需要處理了。
我們繼續修改env.py,也就是告訴alembic你有哪些資料表(上文說的, 資料表都在Base.metadata)。
# 注意這個地方是要引入模型裡面的Base,不是connect裡面的 from app.crud import Base # 告訴alembic 你的表資料在哪 target_metadata = Base.metadata
要注意,我們設定這麼多東西是為了讓alembic知道你的model都在哪,你的資料庫怎麼連,這樣它才能去對比差異並生成結果。
alembic revision --autogenerate -m "test"
稍作等待,我們可以在alembic/versions目錄看到對應的py檔案:
裡面會有drop_column(刪除欄位)這樣的操作資訊。但要注意,這並沒有真正修改資料庫。
alembic upgrade head
執行上述命令,alembic就會根據你當前的版本(應該是你剛才生成的version的py指令碼)去執行資料庫變更操作。
這樣,一個簡單的遷移工作就完成了。接著我們聊聊注意事項。
Q. 版本py指令碼無變更資訊出現
A. 請檢查你的資料庫是否真有變更,檢查你的資料庫url是否正確,檢查你的model是否引入正確,如果操作都沒問題,可以刪除alembic目錄和ini,重複上述操作(我昨晚就是這樣的)
Q. 為什麼欄位重新命名沒有產生變更
A. 這玩意只校驗了新增/修改/刪除欄位,這裡的修改指的是欄位的nullable這種修改,所以改欄位名它不會檢測。
Q. 我資料庫裡面有表沒有定義到model,為啥變更給俺把表刪除了?
A. 這個問題我也發現了,應該是有什麼設定可以設定不刪除未找到的表,但我目前還沒有去研究,有後續會在底部留言。
最後,這個玩意相對比較雞肋,建議不要大批次變更。可以頻率高一點,比如有一點點改動就用它變更一下,而不要在史詩級改動的時候使用它。我個人的整體感受是,不太好用,但勉強能用。(因為暫時沒有發現更合適的)
到此這篇關於python FastApi實現資料表遷移流程詳解的文章就介紹到這了,更多相關python資料表遷移內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45