用 django south 做 database migration - Oceanic / 人生海海
用 Django South 做 Database Migration
Nov 2nd, 2009
south, 一個幫 django 做 database migration 的 app, 真的是超方便的。 以前在 itszero 傳授我 RoR 的時候, 曾經見識過 RoR 的 database migration, 不過當時完全不知道是要用來幹嘛的 XD ( php 的世界裡面沒有這個東西 XD 不過現在應該有 framework 提供?) 只能說 RoR 真是先進阿!
不過幸好 django 也有 south 這個 app 可以用來作 database migration。 以往 django 寫好 model 之後, 執行 syncdb 就可以自動幫我們把 database schema 給建好, 不過僅限第一次, 之後在修改 models 的時候, 就得手動去改 database, syncdb 是無用的。 因為執行 syncdb 時, 如果 table 已經存在, django 就會略過他了, 幸好有 south 可以來自動處理這一個煩人的工作。
而 south 的使用方式也很簡單, 基本上看一下 south 提供的 quick start guide 就可以了, 以下簡單說明一下。 ( 我不能一直用超短文來騙 pageview XD )
將 app 轉換使用 south
python manage.py convert_to_south <app_name>
在這個動作 south 會檢視現有的 models, 然後會在 app 裡開一個叫 migrations 的目錄, 並新增一個 0001_initial.py。 不過不用怕, 雖然這裡執行的指令叫 convert_to_south, 不過他其實就只是多一個 migrations 的目錄, 用這個目錄是否存在來判斷是否已經轉換為 south。 所以不想用 south 的話, 把 migrations 這個目錄刪掉即可。
用 south 找出 model 的更動
當 app 轉換為使用 south 之後, 之後如果有對 model 做更動, 只需執行下面指令, south 會自動幫你找出 model 的改變, 像是新增或刪除了某個欄位, 或是加了 index 之類的的動作, south 都會幫你找出來。
python manage.py startmigration <app_name> <migration_name> --auto
用 south 自動改變 database schema
上面的指令只是找出更動的地方, 下面這個指令才會真的執行更動 database 的動作
python manage.py migrate
目前我將 south 搭配 fabric 來做 deploy, 在 deploy 過程中自動執行 databsae migrate 真的是超方便的! 以往在開發時, 可能會因為新增功能, 所以 database 需要新增一些欄位, 然後程式做對應修改, 可是如果要放上 production 時, 就得先到 production 依照之前在開發時所新增的欄位, 來對 database 做相對的動作, 然後再把程式放上去。 老實說這個動作真的超煩的, 搞不好還欄位名稱打錯 XD
順便提一下, 目前用這種方式在 deploy production 上還沒碰到爆炸過, 本來是有點怕怕的 XD
回復 schema
不過有時候還是有要復原 migration 情況, 這點 south 也很輕鬆做到。 在每次修改時 migrations 裡面會從 0001, 0002 慢慢增加, 如果現在 migration file 已經到 0017 了, 想要回復到到之前 0016 的狀況, 只要執行下面指令即可。
python manage.py migrate music 0016
搭配 fabric 來 deploy
其實先前寫了一篇 用 fabric 來 deploy, 裡面的 fabric script 就有用上 south migrate, 有興趣的可以參考一下。
目前整個 deploy 流程大概是這樣, 我會先做 hg push, 然後用打 fab prod deploy, 來 deploy 剛 commit 的程式到 production server, 然後固定執行 python manage.py migrate, 最後才是 service apache2 reload。 所以在 deploy 的時候, south 就會去檢查是否需要 migrate, 有的話就會把 database 更動的地方補上去, 最後 reload apache, 然後程式生效 :D
多舒暢 XD