在前一篇文章中,我們學會了如何在 FastAPI 專案中使用 Alembic 進行資料庫 migration。不過前一篇我們是自己手動撰寫 migration script,今天我們要使用 alembic 自動生成 script 的功能,讓我們更輕鬆地管理資料庫的改動。
如果上一篇有跟著一起動手做的,可以先把資料庫退回前一版 & 刪除 script,今天我們要試試看自動建立一樣的腳本。
手動撰寫 migration script 可能容易出錯或有遺漏。Alembic 有提供 autogenerate 功能,讓我們可以根據 SQLModel.metadata
的變更,自動產生適當的 migration script。
在 alembic/env.py
檔案中,找到以下部分:
from fastapi_sqlmodel_postgres.models import SQLModel
# 修改這一行,讓 Alembic 知道我們的 table schema
target_metadata = SQLModel.metadata
這樣 Alembic 就能夠根據 SQLModel 的定義,自動偵測資料表結構的改動。
當我們修改了 models.py
,例如:
from sqlmodel import SQLModel, Field
class Orders(SQLModel, table=True):
id: int = Field(default=None, primary_key=True)
customer_id: str
status: str
new_column: str = Field(default=None, nullable=True) # 新增欄位
然後執行以下指令來自動產生 migration script:
alembic revision --autogenerate -m "Add new_column to Orders"
這會產生一個新的 migration 檔案,而且 upgrade()
和 downgrade()
都會自動填好了:
def upgrade() -> None:
op.add_column("orders", sa.Column("new_column", sa.String(), nullable=True))
def downgrade() -> None:
op.drop_column("orders", "new_column")
之後只需要執行:alembic upgrade head
就可以將改動套用到資料庫。
當我們在開發過程中進行多次 migration,可能會需要查看過去的變更紀錄。這時候可以使用 history 指令:alembic history
。可以看到輸出結果會顯示所有的 migration 記錄,包含 version id 和改動標題:
310354c9c4d3 -> 5f32b0ac4d6f (head), Add new_column to Orders
45a67f123abc -> 310354c9c4d3, Initial migration
這樣就可以快速查詢有之前有做過哪些改動。
有時候我們想要確認目前資料庫是在哪一個版本,可以使用:alembic current
。
Current revision(s): 5f32b0ac4d6f (head)
當資料庫結構與 Alembic 的版本追蹤記錄不一致的時候,可以用 alembic stamp
的指令。它可以手動幫資料庫標記為特定版本,讓 Alembic 知道目前資料庫處於哪個版本,但不會執行任何 migration script。
比如說在資料庫已經有 table 的情況下,初次跟 Alembic 整合的時候,可以用 alembic stamp [version]
,就可以將資料庫手動標記為特定的版本,確保 Alembic 與實際狀態保持同步,而不影響現有的資料。
autogenerate
可以自動產生 migration script,減少手動撰寫錯誤。history
指令可查看所有 migration 改動記錄。current
指令可查詢目前資料庫的版本。stamp
可以手動標記資料庫版本,確保 Alembic 與現有資料庫狀態同步,而不執行任何實際改動。終於完成 30 天的挑戰!覺得一開始好像有點太小看它了,為了想要讓每個主題都能夠完整,需要花在研究原理以及動手實作的時間其實不少,但是寫完之後好像真的對資料庫更熟悉的感覺,尤其是自己讀過之後,再使用並且輸出成文字的過程,有點痛苦但是又開心,希望大家跟我一樣覺得有學到很多東西!
最後推薦一下兩位好隊友的系列文章,如果你想要成為一名優秀的軟體工程師,技術只是基石,想要學會如何將技術交付轉化為讓客戶與團隊滿意的「情緒價值」,可以看 牛郎工程師:30 天練成情緒價值與交付感雙滿分的軟體工程師 系列,教你如何成為同時具備技術實力與高情商的「紅牌」工程師,讓你在解決問題的同時,也完美處理客戶的感受與情緒。
如果你想在 AI 世代快速學會如何將 AI 融入個人開發工作流,請參考我們團長的 AI-Driven Development - 個人開發者的敏捷實踐 系列,從軟體開發方法論,到各種不同 AI 工具的評比,讓你學習怎麼將 AI 融入從需求分析、架構設計、程式撰寫。
感謝你的閱讀與支持!我們不知道會不會明年再見 😆