5

Sto costruendo un sito Web in Django Framework, questo sito web deve avere diversi schemi SQL, per ora sono riuscito a creare tutti gli schemi e tutte le cose, ma non capisco perché la tabella django_migrations è in ogni schema dopo la migrazione dei database.Perché la tabella django_migrations in tutti i database

  • Basi di dati attesi Contenuto:

    tavoli AppDB sono tutti i modelli definiti da questa applicazione

    predefinite tabelle DB sono tutte le tabelle Django (admin, ContentTypes, AUTH, sessioni)

  • Database Contenuto:

    tavoli AppDB sono tutti i modelli definiti da questa applicazione + django_migrations

    tabelle predefinite sono tutte le tabelle Django (admin, ContentTypes, auth, sessioni) + django_migrations

Quelli sono i router di il 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 

Grazie.

risposta

0

La tabella django_migrations registra quali migrazioni sono state applicate su tale database. È il meccanismo con cui il sistema di migrazione Django comprende lo stato corrente del database e le migrazioni che devono essere eseguite. Quindi è richiesto su tutti i database.

Ora, se si avesse una tabella che non necessitava effettivamente di migrazioni, ad esempio un database di sola lettura, ciò potrebbe causare problemi. Questo è l'argomento di this ticket.

+0

Penso che tu non abbia capito cosa ho chiesto, la mia domanda è questa, Ho 2 db, uno dovrebbe includere le informazioni di django e l'altro dovrebbe includere solo i dati per le mie app. quando eseguo la migrazione del progetto crea la tabella django_migrations in entrambi db con gli stessi dati, ho provato quasi tutto per evitare questo, ma nulla mi ha aiutato –

+0

@NadirAlbajari: Non è possibile. Gli altri tavoli che hai menzionato sono solo app opzionali e possono essere messi ovunque. La tabella delle migrazioni non è facoltativa, deve esistere su ciascun database in modo che possa tenere traccia delle migrazioni applicate a quel database. –

+0

Grazie a @Kevin, lo capisco, ma supponendo che io abbia 2 app (app1, app2) e 2 database (db1, db2), mi piacerebbe avere le relative migrazioni per app1 in db1 e lo stesso per app2 in db2. ma la tabella delle migrazioni in db1 contiene le migrazioni per le 2 app e le stesse per db2. c'è una buona ragione per cui questo accada? C'è un modo per avere le migrazioni per 2 app separate? Grazie ancora !! –

0

Prima della versione 1.7 di Django, non esisteva una tabella django_migrations. Successivamente, Django ha giustamente incluso le migrazioni per la gestione delle modifiche relative allo schema del database, ovvero modifiche nella definizione dei campi, aggiunta o cancellazione dei campi in db.models.

nelle versioni precedenti, gli sviluppatori di utilizzare django_south_migration app per fare esattamente questo, ma dal momento che quasi tutti lo stava usando, Django incluso nella versione 1.7 in poi.

Ora venendo alla tua domanda, la tabella django_migrations tiene traccia dei cambiamenti nello schema del database applicato al database. Questa tabella aiuta Django ad applicare nuove migrazioni create dopo python manage.py makemigrations.

La colonna dell'app di questa tabella registra il nome dell'app a cui è stata applicata questa migrazione. Se andrai alla directory delle migrazioni di qualsiasi app django, vedrai i file di migrazione del modulo 0001_auto .py ecc.
ad esempio se questa migrazione è stata applicata al database, troverai una voce con nome = 0001_auto e app = nella tabella django_migrations.

+0

Penso che tu non abbia capito cosa ho chiesto, la mia domanda è questa, Ho 2 db, uno dovrebbe includere le informazioni di django e l'altro dovrebbe includere solo i dati per le mie app. quando eseguo la migrazione del progetto, crea la tabella django_migrations in entrambi i db con gli stessi dati, ho provato quasi tutto per evitare questo, ma nulla mi ha aiutato –

Problemi correlati