5

我下Django框架建設一個網站,這個網站需要有不同的SQL計劃django_migrations表,現在我成功創建的所有計劃和所有的東西,但我不明白爲什麼表django_migrations在數據庫遷移後的每個模式中。爲什麼在所有數據庫中

  • 預計數據庫中的內容:

    AppDB表是

    此應用

    默認的數據庫表都是Django的表中定義的所有車型(管理員,CONTENTTYPES,身份驗證,會話)

  • 數據庫內容:

    AppDB表是所有通過這個程序定義+模型django_migrations

    DEFAULT表所有Django的表(管理員,CONTENTTYPES,AUTH,會話)+ django_migrations

那些是的路由器2 dbs:

class DefaultRouter(object): 
    APPS = ['auth', 'sessions', 'admin', 'contenttypes'] 
    DB = 'default' 

    def db_for_read(self, model, **hints): 
     if model._meta.app_label in self.APPS: 
      return self.DB 
     return None 

    def db_for_write(self, model, **hints): 

     if model._meta.app_label in self.APPS: 
      return self.DB 

     return None 

    def allow_relation(self, obj1, obj2, **hints): 

     if obj1._meta.app_label in self.APPS or obj2._meta.app_label in self.APPS: 
      return True 
     return None 

    def allow_migrate(self, db, app_label, model_name=None, **hints): 

     if app_label in self.APPS: 
      return db == self.DB 
     return None 


class MyAppDBRouter(object): 
    def db_for_read(self, model, **hints): 
     return self.check_app_label(model) 

    def db_for_write(self, model, **hints): 
     return self.check_app_label(model) 

    def allow_relation(self, obj1, obj2, **hints): 
     if obj1._meta.app_label == 'myapp' or obj2._meta.app_label == 'myapp': 
      return True 
     return None 

    def allow_migrate(self, db, app_label, model_name=None, **hints): 
     if app_label == 'myapp': 
      return db == 'appdb' 
     return None 

    @staticmethod 
    def check_app_label(model): 
     if model._meta.app_label == 'myapp': 
      return 'appdb' 
     return None 

謝謝。

回答

0

django_migrations表記錄了哪個遷移已應用於該數據庫。這是Django遷移系統瞭解數據庫當前狀態以及需要運行哪些遷移的機制。所以這是所有數據庫都需要的。

現在,如果您有一個實際上並不需要遷移的表(例如只讀數據庫),那麼這可能會導致問題。這是this ticket的主題。

+0

我認爲你不明白我的要求,我的問題是這樣的, 我有2分貝,一個應該包括django信息,另一個應該只包括我的應用程序的數據。 當我遷移項目時,它在兩個數據庫中創建django_migrations表,使用相同的數據,我儘量避免這種情況,但沒有幫助我 –

+0

@NadirAlbajari:這是不可能的。您提到的其他表格只是可選應用程序,可以放在任何地方。遷移表不是可選的,它必須存在於每個數據庫上,以便它可以跟蹤在該數據庫上應用了哪些遷移。 –

+0

謝謝@Kevin,我明白這一點,但假設我有2個應用程序(app1,app2)和2個數據庫(db1,db2),我想要在db1中爲app1進行相關遷移,而在db2中爲app2執行相同的遷移。但是db1中的遷移表包含2個應用程序的遷移,而對於db2則包含遷移。 爲什麼發生這種情況有一個很好的理由嗎?有什麼辦法可以將2個應用程序的遷移分開嗎? 再次感謝! –

0

在Django 1.7之前,沒有django_migrations表。此後,Django正確地包含了用於處理數據庫模式相關更改的遷移,即字段定義中的更改,db.models中字段的添加或刪除。

在早期版本中,開發人員使用django_south_migration應用了整整這樣做,但因爲幾乎每個人都在使用它,Django的包括在1.7版本起。

現在來到您的問題,django_migrations表保留了數據庫模式中應用於數據庫的更改記錄。該表幫助django應用 python manage.py makemigrations之後創建的新遷移。到該遷移應用此表中的記錄的應用程序的名稱的

應用柱。如果你會去任何Django應用程序的遷移目錄,你會看到以下形式的遷移文件0001_auto的.py等
例如,如果這種移植已經應用到數據庫中,你會發現與名稱= 0001_auto及應用條目=在django_migrations表中。

+0

我認爲你不明白我的要求,我的問題是這樣的, 我有2分貝,一個應該包括django信息,另一個應該只包括我的應用程序的數據。 當我遷移項目時,它在兩個數據庫中創建django_migrations表,使用相同的數據,我儘量避免這種情況,但沒有任何幫助 –

相關問題