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

更新 發佈閱讀 7 分鐘

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

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

🚀 Alembic 是什麼?

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


搭配 Alembic,你可以:

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

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

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

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


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


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

vocus|新世代的創作平台


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

vocus|新世代的創作平台


Upgrade & Downgrade 升版與退版

vocus|新世代的創作平台


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


🛠️ Alembic 實際操作流程圖

vocus|新世代的創作平台


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

vocus|新世代的創作平台


🗂 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的沙龍
160會員
332內容數
哈囉,我是阿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
在模擬自然界中的事物時導入隨機性,可以讓結果看起來比較自然,但如果導入的隨機性都是uniform distribution,那未免也太呆板了。這時候,我們需要nonuniform distribution亂數,來讓模擬出來的結果,更像真的一樣。
Thumbnail
在模擬自然界中的事物時導入隨機性,可以讓結果看起來比較自然,但如果導入的隨機性都是uniform distribution,那未免也太呆板了。這時候,我們需要nonuniform distribution亂數,來讓模擬出來的結果,更像真的一樣。
Thumbnail
從 JavaScript 到 Python
Thumbnail
從 JavaScript 到 Python
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
在 Python 自動化領域中,pyautogui 是非常常用的工具,可以幫你模擬滑鼠與鍵盤操作。 這篇帶你快速掌握: ✔ 滑鼠移動 ✔ 點擊操作 ✔ 拖曳 ✔ 滾動
Thumbnail
在 Python 自動化領域中,pyautogui 是非常常用的工具,可以幫你模擬滑鼠與鍵盤操作。 這篇帶你快速掌握: ✔ 滑鼠移動 ✔ 點擊操作 ✔ 拖曳 ✔ 滾動
Thumbnail
XGBoost(eXtreme Gradient Boosting)是一種基於梯度提升框架的機器學習算法,專注於高效的分類與迴歸問題。它廣泛應用於數據分析和競賽中,因其出色的模型訓練能力。本文探討 XGBoost 實際中的實作,適合希望掌握此技術的讀者,並對模型調參提供有價值的技巧與建議。
Thumbnail
XGBoost(eXtreme Gradient Boosting)是一種基於梯度提升框架的機器學習算法,專注於高效的分類與迴歸問題。它廣泛應用於數據分析和競賽中,因其出色的模型訓練能力。本文探討 XGBoost 實際中的實作,適合希望掌握此技術的讀者,並對模型調參提供有價值的技巧與建議。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
Thumbnail
在做自動化工具或測試腳本時,常常會需要操作視窗,例如: 👉 找到特定程式 👉 切換視窗 👉 自動化點擊操作 這時候,pyautogui 是一個很好上手的工具。
Thumbnail
在做自動化工具或測試腳本時,常常會需要操作視窗,例如: 👉 找到特定程式 👉 切換視窗 👉 自動化點擊操作 這時候,pyautogui 是一個很好上手的工具。
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
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
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News