亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python?FastApi怎么實現數據表遷移

發布時間:2022-08-26 15:00:16 來源:億速云 閱讀:219 作者:iii 欄目:開發技術

本篇內容介紹了“python FastApi怎么實現數據表遷移”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    啥是數據遷移

    在我們平時的開發過程中,經常需要對一些數據進行調整。一般會有以下幾種場景:

    1.需要新的數據表

    我們的接口自動化平臺雖然已經較為完善了,但難免會繼續迭代一些新的功能,假設我們需要做一個訂閱用例的功能。

    大體想一下就可以知道,訂閱用例以后這個數據得持久化(即入庫),這樣我在查詢誰訂閱了這條用例的時候,就能獲取到訂閱人,訂閱時間等數據。

    這也就意味著我們需要一張訂閱表,里面至少得有訂閱人和訂閱的id,以及訂閱時間這3個要素。體現在數據庫通俗點說就需要:

    // 創建訂閱表, 后面的省略
    create table...

    由于業務的變動,導致新的數據表誕生。

    2.需要對現有表結構進行調整

    當我們的訂閱表完成以后,有的同學就發現了,這個訂閱好像不能取消,所以我們此時可能需要一個新的字段: isValid,這個字段用來判斷用戶是否取消訂閱了這個用例,如果我訂閱錯了,或者嫌消息太多,想取消訂閱,那還是得滿足需求的。

    包括新增字段/修改字段/刪除字段,這些都會對數據表產生影響,導致我們需要改動數據庫。

    回到ORM

    我們目前采用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(建立全部表)的功能

    安裝alembic

    大家采用虛擬環境和全局安裝都可以,我的建議是全局安裝,因為我們可能會在多個項目使用它。

    pip install alembic 

    初始化項目

    我們在python項目的根目錄輸入以下命令:

    alembic init alembic 

    alembic是我們剛才安裝的工具,init則是初始化的意思,后面的alembic則是遷移文件夾的名字,一般我們會默認叫alembic,以便于其他人一眼就知道是干嘛的。

    修改alembic.ini

    執行完成之后你會發現根目錄多了個ini配置文件和alembic文件夾,我們需要稍微修改下配置文件:

    python?FastApi怎么實現數據表遷移

    將alembic.ini中的sqlalchemy.url改為你數據庫的jdbc連接地址,以我的為例:

    python?FastApi怎么實現數據表遷移

    修改alembic/env.py

    首先我們找到里面的target_metadata變量,默認是None。接著在target_metadata = None上方加入如下代碼:

    import sys
    from os.path import abspath, dirname
    sys.path.append(dirname(dirname(abspath(__file__))))

    然后我們需要引入我們的model目錄,由于在pity里面,最后的初始化建表工作都是在curd目錄進行的:

    python?FastApi怎么實現數據表遷移

    所以我這邊是引入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文件:

    python?FastApi怎么實現數據表遷移

    里面會有drop_column(刪除字段)這樣的操作信息。但要注意,這并沒有真正修改數據庫。

    變更數據庫

    alembic upgrade head 

    執行上述命令,alembic就會根據你當前的版本(應該是你剛才生成的version的py腳本)去執行數據庫變更操作。

    這樣,一個簡單的遷移工作就完成了。接著我們聊聊注意事項。

    FAQ

    Q. 版本py腳本無變更信息出現

    A. 請檢查你的數據庫是否真有變更,檢查你的數據庫url是否正確,檢查你的model是否引入正確,如果操作都沒問題,可以刪除alembic目錄和ini,重復上述操作(我昨晚就是這樣的)

    Q. 為什么字段重命名沒有產生變更

    A. 這玩意只校驗了新增/修改/刪除字段,這里的修改指的是字段的nullable這種修改,所以改字段名它不會檢測。

    Q. 我數據庫里面有表沒有定義到model,為啥變更給俺把表刪除了?

    A. 這個問題我也發現了,應該是有什么配置可以配置不刪除未找到的表,但我目前還沒有去研究。

    “python FastApi怎么實現數據表遷移”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    关岭| 涿鹿县| 伊宁市| 汉阴县| 大石桥市| 兴国县| 昌黎县| 邳州市| 乐安县| 南昌市| 林甸县| 巴里| 达日县| 博罗县| 洱源县| 昌邑市| 松溪县| 托里县| 闻喜县| 湛江市| 丰宁| 高淳县| 龙山县| 南涧| 新绛县| 莒南县| 五指山市| 滦南县| 突泉县| 襄汾县| 澳门| 清原| 朝阳市| 古交市| 大洼县| 怀仁县| 丰台区| 邻水| 红安县| 长兴县| 宽城|