Pour un projet à Django, je dois utiliser deux bases de données: par défaut et à distance . J'ai créérouters.py
et tout fonctionne bien.
Il était nécessaire de créer une table sur la base de données distante et j'ai créé la migration, l'exécuter et la table a django_migrations
été créée. Je veux avoir une seule tabledjango_migrations
, dans la base de données par défaut.
La partie pertinente de routers.py
est ici:
class MyRouter(object):
# ...
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'my_app':
return db == 'remote'
return None
Je lance la migration comme ceci:
python manage.py migrate my_app --database=remote
Maintenant, quand je fais:
python manage.py runserver
J'obtiens l'avertissement suivant:
Vous avez 1 migration (s) non appliquée (s). Votre projet peut ne pas fonctionner correctement tant que vous n'avez pas appliqué les migrations pour les applications: my_app.
Exécutez 'python manage.py migrate' pour les appliquer.
Les tables pour my_app
sont créées dans la remote
base de données et à l' django_migrations
intérieur duremote
base de données, les migrations sont marquées comme appliquées.
EDIT:
Comment forcer Django à utiliser une seule table django_migrations
, mais toujours appliquer les migrations dans différentes bases de données?
Comment appliquer les migrations dans différentes bases de données afin qu'aucun avertissement ne soit émis?
la source
django_migrations
table partagée , il sera nécessaire de différencier les lignes avec les migrations pourdefault
etremote
db. C'est assez profond dans les internes de Django. Je risquerais même d'affirmer que cela nécessiterait une réécriture majeure du code de migration.Réponses:
Grâce aux commentaires sur ma question, j'ai fait quelques recherches et suis arrivé aux conclusions suivantes.
L'utilisation de plusieurs bases de données entraîne la création d'une table
django_migrations
lorsque des migrations sont utilisées. Il n'y a pas d'option pour enregistrer les migrations dans une seule tabledjango_migrations
, comme l' explique le commentaire de Kamil Niski . C'est clair après avoir lu le fichierdjango/db/migrations/recorder.py
.Je vais illustrer un exemple avec un projet
foo
et une applicationbar
à l'intérieur du projet. L'applicationbar
n'a qu'un seul modèleBaz
.Nous créons le projet:
Nous avons maintenant ces contenus dans le répertoire principal du projet:
J'ai l'habitude de regrouper toutes les applications dans le répertoire du projet:
Dans le fichier,
foo/settings.py
nous ajustons les paramètres pour utiliser deux bases de données différentes, aux fins de cet exemple, nous utilisonssqlite3
:Maintenant, nous exécutons les migrations:
Cela exécute toutes les migrations, la partie
--database=default
est facultative, car si non spécifié, Django utilise la base de données par défaut.Django a appliqué toutes les migrations à la base de données par défaut:
Maintenant, nous créons le modèle
Baz
:models.py
:enregistrer l'application
bar
dansINSTALLED_APPS
(foo/settings.py
) et créer des migrations:Avant d'exécuter les migrations que nous créons
routers.py
dans l'bar
application:et enregistrez-le dans
foo/settings.py
:Maintenant, l'approche naïve serait d'exécuter les migrations
bar
dans laremote
base de données:Les migrations ont été appliquées à la
remote
base de données:Quand nous courons:
l'avertissement suivant sera émis:
Cependant, tout semble bien fonctionner. Cependant, il n'est pas satisfaisant d'avoir cet avertissement.
La bonne façon serait d'exécuter toutes les migrations pour chaque base de données comme suggéré dans cette réponse .
Cela ressemblerait à ceci:
et après avoir créé les migrations pour
bar
:Le routeur veillera à ce que la table
bar_baz
soit créée uniquement dans laremote
base de données, mais Django marquera les migrations comme appliquées dans les deux bases de données. Aussi les tables pourauth
,admin
,sessions
, etc. seront créés uniquement dans ladefault
base de données, comme indiqué dansrouters.py
. La tabledjango_migrations
de laremote
base de données contiendra également des enregistrements pour ces migrations.C'est une longue lecture, mais j'espère que cela jette un peu de lumière sur ce problème, à mon avis, pas complètement expliqué dans la documentation officielle .
la source