【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
留言分享你的想法!
avatar-img
阿Han的沙龍
148會員
315內容數
哈囉,我是阿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
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
生產力爆發帶來的過剩,會讓過去的「還可以啦」成為最低標準。市場需求對於出類拔萃、獨一無二的需求還是存在,但是對於那些價格高度敏感,或是只需要穩定、便宜、還可以啦的需求端來說,AI 正在迅速取代這部分的供給,中間長尾的服務提供者被 AI 替換。
Thumbnail
生產力爆發帶來的過剩,會讓過去的「還可以啦」成為最低標準。市場需求對於出類拔萃、獨一無二的需求還是存在,但是對於那些價格高度敏感,或是只需要穩定、便宜、還可以啦的需求端來說,AI 正在迅速取代這部分的供給,中間長尾的服務提供者被 AI 替換。
Thumbnail
年末總有一種莫名的魔力,讓人特別容易感到孤單。 聖誕節、跨年、緊接著農曆新年……滑開社群,不是甜蜜放閃,就是一群人早早訂好跨年行程。 明明日子算得上順遂,工作穩定無憂,生活也按部就班地往前走着,可總在萬籟俱寂的夜晚,獨自對着空蕩的房間時,心底會悄悄冒出一個念頭:今年,是不是可以不一樣?不再獨自抵
Thumbnail
年末總有一種莫名的魔力,讓人特別容易感到孤單。 聖誕節、跨年、緊接著農曆新年……滑開社群,不是甜蜜放閃,就是一群人早早訂好跨年行程。 明明日子算得上順遂,工作穩定無憂,生活也按部就班地往前走着,可總在萬籟俱寂的夜晚,獨自對着空蕩的房間時,心底會悄悄冒出一個念頭:今年,是不是可以不一樣?不再獨自抵
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)也是技術指標當中最常被當第一個學習的指標。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News