5

Ich baue eine Website unter Django Framework, diese Website muss verschiedene SQL-Schemas haben, für jetzt habe ich erfolgreich erstellt alle Schemata und alle Sachen, aber ich verstehe nicht, warum die Tabelle django_migrations ist in jedem Schema nach der Migration von Datenbanken.Warum ist django_migrations Tabelle in allen Datenbanken

  • Erwartete Datenbanken Inhalt:

    AppDB Tabellen sind alle Modelle von dieser App definiert

    Standard DB-Tabellen sind alle Django Tabellen (admin, Content, Auth, Sitzungen)

  • Datenbankinhalt:

    AppDB Tabellen sind alle Modelle von dieser App + django_migrations definiert

    STANDARD Tabellen werden alle Django Tabellen (admin, Content, Auth, Sitzungen) + django_migrations

Das sind die Router von die 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 

Danke.

Antwort

0

Die Tabelle django_migrations zeichnet auf, welche Migrationen auf diese Datenbank angewendet wurden. Dies ist der Mechanismus, mit dem das Django-Migrationssystem den aktuellen Status der Datenbank versteht und welche Migrationen ausgeführt werden müssen. Es ist also in allen Datenbanken erforderlich.

Wenn Sie jetzt eine Tabelle haben, die keine Migrationen benötigt - z. B. eine schreibgeschützte Datenbank -, kann dies zu Problemen führen. Das ist das Thema von this ticket.

+0

Ich denke, dass Sie nicht verstanden haben, was ich gefragt habe, ist meine Frage, Ich habe 2 db, sollte eine Django Informationen enthalten, und die andere sollte nur Daten für meine Anwendungen enthalten. Wenn ich das Projekt migrieren erstellt es die django_migrations Tabelle in beiden db mit den gleichen Daten, habe ich versucht fast alles um das zu vermeiden, aber nichts hat mir geholfen –

+0

@NadirAlbajari: Es ist nicht möglich. Die anderen Tabellen, die du erwähnt hast, sind nur optionale Apps und können überall platziert werden. Die Migrationstabelle ist nicht optional. Sie muss in jeder Datenbank vorhanden sein, damit sie verfolgen kann, welche Migrationen auf diese Datenbank angewendet wurden. –

+0

Danke @Kevin, ich verstehe das, aber unter der Annahme, dass ich 2 Apps (app1, app2) und 2 Datenbanken (db1, db2) habe, möchte ich die zugehörigen Migrationen für app1 in db1 und das gleiche für app2 in db2 haben. Die Migrationstabelle in db1 enthält jedoch die Migrationen für die beiden Apps und die gleichen für db2. Gibt es einen guten Grund, warum dies passiert? Gibt es eine Möglichkeit, die Migrationen für 2 Apps zu trennen? Danke nochmal !! –

0

Vor Version 1.7 von Django gab es keine django_migrations-Tabelle. Danach berücksichtigte Django zu Recht Migrationen für die Behandlung von datenbankschemabezogenen Änderungen, dh Änderungen in der Felddefinition, Hinzufügung oder Löschung von Feldern in db.models.

In früheren Versionen verwenden Entwickler django_south_migration App für genau dies zu tun, aber da fast jeder es wurde mit Django enthielt ab in Version 1.7.

Jetzt kommt zu Ihrer Frage, django_migrations Tabelle Aufzeichnungen über Änderungen in Datenbank-Schema für die Datenbank. Diese Tabelle hilft django beim Anwenden neuer Migrationen, die nach python manage.py makemigrations erstellt wurden.

App-Spalte dieser Tabelle zeichnet den Namen der App auf, auf die diese Migration angewendet wurde. Wenn Sie in das Migrationsverzeichnis einer beliebigen Django-App gehen, werden Sie Migrationsdateien des Formats 0001_auto .py usw. sehen.
Wenn diese Migration beispielsweise auf die Datenbank angewendet wurde, finden Sie einen Eintrag mit name = 0001_auto und app = in django_migrations Tabelle.

+0

Ich denke, dass Sie nicht verstanden haben, was ich gefragt habe, meine Frage ist dies, Ich habe 2 db, sollte eine django Informationen enthalten, und die andere sollte nur Daten für meine Apps enthalten. Wenn ich das Projekt migrieren erstellt es die django_migrations Tabelle in beiden db mit den gleichen Daten, ich versuchte fast alles, um dies zu vermeiden, aber nichts half mir –

Verwandte Themen