2016-08-24 24 views
2

我正在構建一個Django支持的站點,我想爲某些應用程序分別創建數據庫,我構建了一個將每個應用程序路由到預定義數據庫的靈活路由器,此工作正常。 問題是,當我遷移我的模型時,我必須每次都設置--database參數,我覺得這很煩人和冗餘。還有很多次,我用遷移應用程序的表填充了我的默認數據庫(通過忘記添加--database)。 我在我的路由器中用allow_migrate(...)函數進行了實驗,但是我所能實現的只是安全機制,如果我忘記指定數據庫,將無法運行遷移。 我的問題是:有沒有一種方法可以爲Django中的模型遷移設置自動數據庫選擇? 我的方法可能是錯的,這令我感到驚訝,以前似乎沒有人做過。在Django中遷移的自動數據庫路由器

回答

1

我不知道有什麼辦法自動做到這一點。但是,一個簡單的方法可能是migrate命令的write your own version命令通過適當的--database和應用程序參數多次調用Django migrate命令。

根據Django遷移的作者,這是a conscious design decision,所以我不希望它改變:「就像syncdb一樣,遷移一次只能在一個數據庫上運行,因此您必須單獨爲每個數據庫執行它,正如你所建議的那樣,這是設計的。「

+0

感謝您對本主題的討論鏈接,似乎db/migrations子系統的設計不支持我的首選解決方案。我會嘗試你的建議。 – Raff89

2

對於任何人面臨我是有問題的,這裏是我最終選擇:

routers.py:

from django.conf import settings 
class DatabaseAppsRouter(object): 

    def db_for_read(self, model, **hints): 
     # your db routing 

    def db_for_write(self, model, **hints): 
     # your db routing 

    def allow_relation(self, obj1, obj2, **hints): 
     # your db routing 

    def allow_syncdb(self, db, model): 
     # your db routing 

    def allow_migrate(self, db, app_label, model_name=None, **hints): 
     if db in settings.DATABASE_APPS_MAPPING.values(): 
      return settings.DATABASE_APPS_MAPPING.get(app_label) == db 
     elif app_label in settings.DATABASE_APPS_MAPPING: 
      return False 

settings.py

DATABASE_ROUTERS = ['project.routers.DatabaseAppsRouter'] 
DATABASE_APPS_MAPPING = {'contenttypes': 'default', 
        'auth': 'default', 
        'admin': 'default', 
        'sessions': 'default', 
        'messages': 'default', 
        'staticfiles': 'default', 
        'myapp': 'mydb', 
        } 

這個設置讓我可以運行兩個com mands:

python manage.py migrate 
python manage.py migrate --database=mydb 

這仍然是一個很多,但至少現在我不能錯誤地遷移到MYAPP即發生多次,我要承認的默認數據庫。


警告 - 咆哮:

到現在爲止,我發現Django的設計是quircky但非常合乎邏輯和程序員友好,像Python本身。但是,遷移與多個數據庫設置交互的方式實際上很不方便,因此很容易將缺省數據庫氾濫到不需要的表中。 凱文在他的回答中提到的討論表明,我不是唯一有這種困難的人。