一日一技:如何讓Django 的app migration從新與數據庫同步python
今天的文章,沒有用過Django的同窗可能難以理解我在說什麼。可是若是你被Django的migration折騰過,那麼你必定會感謝這篇文章。web
當咱們使用Django + MySQL開發網站服務的時候,咱們應該始終使用Django來管理數據庫,不管是增長字段,刪除字段,修改字段,都應該直接修改Django工程 app裏面對應的 models.py文件,不該該再手動直接修改數據庫。數據庫
但這種理想的狀況有時候會被打破。我最近遇到了這樣一種狀況:安全
出於安全考慮,我把線上的MySQL數據庫禁用了 drop的權限。但因爲我修改了 models.py文件中的字段,因而觸發了 drop字段的操做,因爲沒有權限,致使Django在migration線上數據庫的時候報錯。app
因爲上線時間緊急,當時我直接經過執行SQL語句在線上MySQL中建立了對應的數據表和字段。ide
如今就出現問題了:網站
1.首先,Django的web服務可以正常工做,由於數據表是徹底正確的。
2.app的migration一共有10條,在進行到第6條的時候報錯。剩下的4步沒法繼續執行。
3.數據庫通過人工修改,看起來像是把全部migration都執行完的樣子,但實際上最後4步是經過執行SQL語句手動建立的。
4.若是不增刪改新的字段,那麼到目前爲止不會有什麼問題。可是若是增長修改了新的字段,migration將會始終失敗。除非每一次都手動修改數據庫。
如今的狀況就是數據庫與Migration不一致,可使用下面的命令從新同步migration和數據庫。code
# 清除遷移歷史記錄 python manage.py migrate --fake app_name zero # 查看當前的migration進度,此時文件前的 [x] 變成了[ ] python manage.py showmigrations app_name #刪除app-migrations下除__init__.py的其餘文件 #執行makemigrations,程序會再次爲這個app 生成 0001_initial.py 文件 python manage.py makemigrations app_name # 把當前數據庫的狀態做爲初始狀態 python manage.py migrate --fake-initial app_name
從如今開始,你再次對數據庫進行更改之後,從新make migration,全部新的操做都會基於當前的數據庫狀態繼續進行,migration和數據庫又從新同步了。blog
kingname
攢錢給產品經理買房。開發