Für ein Projekt in Django muss ich zwei Datenbanken verwenden: Standard und Remote . Ich habe erstellt routers.py
und alles funktioniert gut.
Es war erforderlich, eine Tabelle in der entfernten Datenbank zu erstellen, und ich habe eine Migration erstellt, sie ausgeführt und die Tabelle django_migrations
wurde erstellt. Ich möchte nur eine Tabelle django_migrations
in der Standarddatenbank haben.
Der relevante Teil von routers.py
ist hier:
class MyRouter(object):
# ...
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'my_app':
return db == 'remote'
return None
Ich führe die Migration folgendermaßen aus:
python manage.py migrate my_app --database=remote
Jetzt, wenn ich es tue:
python manage.py runserver
Ich erhalte folgende Warnung:
Sie haben 1 nicht angewendete Migration (en). Ihr Projekt funktioniert möglicherweise erst ordnungsgemäß, wenn Sie die Migrationen für App (s) anwenden: my_app.
Führen Sie 'python manage.py migrate' aus, um sie anzuwenden.
Die Tabellen für my_app
werden in der remote
Datenbank erstellt, und in django_migrations
der remote
Datenbank werden die Migrationen als angewendet markiert.
BEARBEITEN:
Wie kann man Django zwingen, nur eine Tabelle zu verwenden django_migrations
und trotzdem die Migrationen in verschiedene Datenbanken anzuwenden?
Wie wende ich die Migrationen in verschiedenen Datenbanken an, damit keine Warnungen ausgegeben werden?
quelle
django_migrations
Tabelle zu haben , muss zwischen Zeilen mit Migrationen fürdefault
undremote
db unterschieden werden. Dies ist ziemlich tief in den Django-Interna. Ich würde sogar das Risiko eingehen, zu behaupten, dass der Migrationscode grundlegend neu geschrieben werden müsste.Antworten:
Dank der Kommentare zu meiner Frage habe ich einige Nachforschungen angestellt und die folgenden Ergebnisse erzielt.
Die Verwendung mehrerer Datenbanken führt zur Erstellung einer Tabelle,
django_migrations
wenn Migrationen verwendet werden. Es gibt keine Möglichkeit, die Migrationen in nur einer Tabelle aufzuzeichnendjango_migrations
, wie der Kommentar von Kamil Niski erklärt. Dies ist nach dem Lesen der Datei klardjango/db/migrations/recorder.py
.Ich werde ein Beispiel mit einem Projekt
foo
und einer Appbar
innerhalb des Projekts veranschaulichen . Die Appbar
hat nur ein ModellBaz
.Wir erstellen das Projekt:
Jetzt haben wir diese Inhalte im Hauptprojektverzeichnis:
Ich habe die Angewohnheit, alle Apps im Projektverzeichnis zu gruppieren:
In der Datei
foo/settings.py
passen wir die Einstellungen an, um zwei verschiedene Datenbanken zu verwenden. Für die Zwecke dieses Beispiels verwenden wirsqlite3
:Jetzt führen wir die Migrationen durch:
Dadurch werden alle Migrationen ausgeführt. Der Teil
--database=default
ist optional, da Django die Standarddatenbank verwendet, wenn nichts angegeben ist.Django hat alle Migrationen auf die Standarddatenbank angewendet:
Jetzt erstellen wir das Modell
Baz
:models.py
::Registrieren Sie die App
bar
inINSTALLED_APPS
(foo/settings.py
) und erstellen Sie die Migrationen:Bevor wir die Migrationen ausführen, die wir
routers.py
in derbar
App erstellen :und registrieren Sie es in
foo/settings.py
:Nun wäre der naive Ansatz, die Migrationen für
bar
in dieremote
Datenbank auszuführen :Die Migrationen wurden auf die
remote
Datenbank angewendet :Wenn wir rennen:
Die folgende Warnung wird ausgegeben:
Alles scheint gut zu funktionieren. Es ist jedoch nicht zufriedenstellend, diese Warnung zu haben.
Der richtige Weg wäre, alle Migrationen für jede Datenbank auszuführen, wie in dieser Antwort vorgeschlagen .
Es würde so aussehen:
und nach dem Erstellen der Migrationen für
bar
:Der Router sorgt dafür, dass die Tabelle
bar_baz
nur in derremote
Datenbank erstellt wird, aber Django markiert die Migrationen als in beiden Datenbanken angewendet. Auch die Tabellen fürauth
,admin
,sessions
etc. werden nur in der erstellt werdendefault
Datenbank, wie angegeben inrouters.py
. Die Tabelledjango_migrations
in derremote
Datenbank enthält auch Datensätze für diese Migrationen.Es ist eine lange Lektüre, aber ich hoffe, sie wirft ein Licht auf dieses meiner Meinung nach nicht gründlich erläuterte Problem in der offiziellen Dokumentation .
quelle