iT邦幫忙

2025 iThome 鐵人賽

DAY 30
3

https://ithelp.ithome.com.tw/upload/images/20250902/20177885b753fkHPgl.png

在前一篇文章中,我們學會了如何在 FastAPI 專案中使用 Alembic 進行資料庫 migration。不過前一篇我們是自己手動撰寫 migration script,今天我們要使用 alembic 自動生成 script 的功能,讓我們更輕鬆地管理資料庫的改動。

如果上一篇有跟著一起動手做的,可以先把資料庫退回前一版 & 刪除 script,今天我們要試試看自動建立一樣的腳本。

使用 autogenerate 自動產生 migration 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)

當我們在開發過程中進行多次 migration,可能會需要查看過去的變更紀錄。這時候可以使用 history 指令:alembic history 。可以看到輸出結果會顯示所有的 migration 記錄,包含 version id 和改動標題:

310354c9c4d3 -> 5f32b0ac4d6f (head), Add new_column to Orders
45a67f123abc -> 310354c9c4d3, Initial migration

這樣就可以快速查詢有之前有做過哪些改動。

查詢目前資料庫版本(current)

有時候我們想要確認目前資料庫是在哪一個版本,可以使用:alembic current

Current revision(s): 5f32b0ac4d6f (head)

標記資料庫版本(stamp)

當資料庫結構與 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 融入從需求分析、架構設計、程式撰寫

感謝你的閱讀與支持!我們不知道會不會明年再見 😆


上一篇
Day 29 - 在 FastAPI 中使用 Alembic 進行資料庫 migration
系列文
PostgreSQL 效能優化 30 天挑戰:從 Index 到 Transaction 的深入探索30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Nick Huang
iT邦新手 5 級 ‧ 2025-09-30 10:57:22

恭喜完賽/images/emoticon/emoticon42.gif

/images/emoticon/emoticon37.gif

1
Ci
iT邦新手 3 級 ‧ 2025-09-30 17:30:24

恭喜完賽~

/images/emoticon/emoticon12.gif

1
雷N
iT邦研究生 1 級 ‧ 2025-10-01 11:00:43

恭喜完賽~

謝謝!/images/emoticon/emoticon07.gif

我要留言

立即登入留言