【Python 軍火庫🧨 - Alembic 】🚀 從混亂到有序,如何讓資料庫版本不再失控

更新 發佈閱讀 7 分鐘

從升級到回溯,輕鬆掌握資料庫 Schema 進化的力量,在軟體開發的世界裡,我們很習慣使用 Git 來管理程式碼版本,但你有沒有想過, 資料庫的結構(Schema)也需要版本管理嗎?

例如你在某次開發中新增了一個欄位 phone 到 user 資料表,過兩天產品經理又說要改欄位名稱,之後可能又要移除,如果我們手動改 SQL,難以追蹤,更難還原, 此時,Alembic 就派上用場了。

🚀 Alembic 是什麼?

Alembic 是一套專門用來管理資料庫結構版本的工具,通常搭配 SQLAlchemy 使用。


搭配 Alembic,你可以:

✔ 安全地更新資料庫結構(upgrade)

✔ 必要時回復到以前版本(downgrade)

✔ 清楚紀錄每次資料庫變化

✔ 多人協作時保持資料庫一致性


你可以把 Alembic 想像成: 👉 「資料庫世界的 Git」。


🎯 Alembic 就像 Git - 資料庫版控概念

raw-image


🚀 Migration 檔案就像一個「前進」「後退」的盒子

raw-image


Upgrade & Downgrade 升版與退版

raw-image


alembic upgrade head    → 跳到最新版本
alembic downgrade -1 → 回退一個版本
alembic downgrade base → 回到最初狀態


🛠️ Alembic 實際操作流程圖

raw-image


🧠 資料庫版本像「樓層」,Alembic 是電梯

raw-image


🗂 Alembic 目錄結構簡圖

/project

├─ alembic/
│ ├─ versions/ ← migration 檔案放這裡
│ │ ├─ 20231110_add_phone.py
│ │ └─ 20231112_add_orders_table.py
│ └─ env.py

├─ app/
│ └─ models.py ← SQLAlchemy Models

├─ alembic.ini ← Alembic 設定檔
└─ main.py


🛠 實作範例:用 Alembic 新增與回復欄位

① 建立基本專案結構

alembic_demo/

├─ models.py
└─ main.py


② 建立 SQLAlchemy Model(models.py)

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class User(Base):
__tablename__ = 'user'

id = Column(Integer, primary_key=True)
name = Column(String)


③ 啟動 SQLite 測試資料庫(main.py)

from sqlalchemy import create_engine
from models import Base

engine = create_engine("sqlite:///example.db", echo=True)
Base.metadata.create_all(engine)


執行:

python main.py

會產生一個 SQLite 資料庫檔 example.db,內含 user 表。


④ 安裝 Alembic 並初始化

pip install alembic
alembic init alembic


執行後會出現:

alembic/          ← Alembic 工作目錄
alembic.ini ← 設定檔


⑤ 設定資料庫連線(修改 alembic.ini)

找到這段,把它改成 SQLite 路徑:

sqlalchemy.url = sqlite:///example.db


⑥ 自動產生第一次 Migration(建立 user 表)

alembic revision --autogenerate -m "create user table"


執行後會在 alembic/versions/ 裡產生一支 migration 檔案。

接著執行 upgrade:

alembic upgrade head

資料庫就會建立 user 表。


⑦ 修改 models.py(新增 phone 欄位)

在 User 類別加上這一行:

phone = Column(String)


完整程式:

class User(Base):
__tablename__ = 'user'

id = Column(Integer, primary_key=True)
name = Column(String)
phone = Column(String) # 新增欄位


⑧ 產生 migration 來新增欄位

alembic revision --autogenerate -m "add phone column to user"


Alembic 會解析模型,產生這樣的 migration 檔:

def upgrade():
op.add_column('user', sa.Column('phone', sa.String()))

def downgrade():
op.drop_column('user', 'phone')


執行:

alembic upgrade head


此時,資料庫裡的 user 表就有 phone 欄位了。


⑨ 如果不需要這個欄位了?執行 downgrade!

alembic downgrade -1

這會自動移除 phone 欄位,資料庫回到前一個版本。

是不是就像 Git 的 git checkout 或 git revert?


🎯 結語:Alembic 讓資料庫不再「不可逆」

資料庫一直是軟體系統裡最難變更的部分之一,但透過 Alembic,我們不只可以「改」,還可以「追蹤、還原、協作、部署」, 它實現了資料庫也能被版本控制!

如果你的專案使用 Python、FastAPI、Flask、SQLAlchemy、或任何關於資料庫的服務,Alembic 絕對是你應該認識的工具。

留言
avatar-img
阿Han的沙龍
150會員
324內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2025/05/14
當我們在開發AI應用程式的時候, 常常會使用到onnx, ONNX 是一種開放標準格式,允許不同深度學習框架(如 PyTorch、TensorFlow、Scikit-learn)之間互通,使模型可以在不同平台上運行,而 ONNX Runtime 則是一個高效能的推理引擎,專門用來加速 ONNX
Thumbnail
2025/05/14
當我們在開發AI應用程式的時候, 常常會使用到onnx, ONNX 是一種開放標準格式,允許不同深度學習框架(如 PyTorch、TensorFlow、Scikit-learn)之間互通,使模型可以在不同平台上運行,而 ONNX Runtime 則是一個高效能的推理引擎,專門用來加速 ONNX
Thumbnail
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
XGBoost(eXtreme Gradient Boosting)是一種基於梯度提升框架的機器學習算法,專注於高效的分類與迴歸問題。它廣泛應用於數據分析和競賽中,因其出色的模型訓練能力。本文探討 XGBoost 實際中的實作,適合希望掌握此技術的讀者,並對模型調參提供有價值的技巧與建議。
Thumbnail
XGBoost(eXtreme Gradient Boosting)是一種基於梯度提升框架的機器學習算法,專注於高效的分類與迴歸問題。它廣泛應用於數據分析和競賽中,因其出色的模型訓練能力。本文探討 XGBoost 實際中的實作,適合希望掌握此技術的讀者,並對模型調參提供有價值的技巧與建議。
Thumbnail
在模擬自然界中的事物時導入隨機性,可以讓結果看起來比較自然,但如果導入的隨機性都是uniform distribution,那未免也太呆板了。這時候,我們需要nonuniform distribution亂數,來讓模擬出來的結果,更像真的一樣。
Thumbnail
在模擬自然界中的事物時導入隨機性,可以讓結果看起來比較自然,但如果導入的隨機性都是uniform distribution,那未免也太呆板了。這時候,我們需要nonuniform distribution亂數,來讓模擬出來的結果,更像真的一樣。
Thumbnail
isalnum() : 檢測字串是否由字母和數字組成 isalpha() : 檢測字串是否只由字母組成 isalnum() str1 = "abc123" print(str1.isalnum()) str2 = "pop.cat" print(str2.isalnum()) str3
Thumbnail
isalnum() : 檢測字串是否由字母和數字組成 isalpha() : 檢測字串是否只由字母組成 isalnum() str1 = "abc123" print(str1.isalnum()) str2 = "pop.cat" print(str2.isalnum()) str3
Thumbnail
從 JavaScript 到 Python
Thumbnail
從 JavaScript 到 Python
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News