W przypadku projektu w Django muszę korzystać z dwóch baz danych: domyślnej i zdalnej . Stworzyłem routers.py
i wszystko działa dobrze.
Wymagano utworzenia tabeli w zdalnej bazie danych, a ja utworzyłem migrację, uruchomiłem ją i tabela django_migrations
została utworzona. Chcę mieć tylko jedną tabelę django_migrations
w domyślnej bazie danych.
Odpowiednia część routers.py
znajduje się tutaj:
class MyRouter(object):
# ...
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'my_app':
return db == 'remote'
return None
Przeprowadzam migrację w następujący sposób:
python manage.py migrate my_app --database=remote
Teraz kiedy to zrobię:
python manage.py runserver
Otrzymuję następujące ostrzeżenie:
Masz 1 niestosowanych migracji. Twój projekt może nie działać poprawnie, dopóki nie zastosujesz migracji aplikacji: my_app.
Uruchom „python manage.py migrate”, aby je zastosować.
Tabele dla my_app
są tworzone w remote
bazie danych, a django_migrations
wewnątrz remote
bazy migracje są oznaczone jako zastosowane.
EDYCJA:
Jak zmusić Django do używania tylko jednej tabeli django_migrations
, ale nadal stosować migracje do różnych baz danych?
Jak zastosować migrację w różnych bazach danych, aby nie były generowane żadne ostrzeżenia?
źródło
django_migrations
tabelę, konieczne będzie rozróżnienie między wierszami z migracjami dladefault
iremote
db. Jest to dość głęboko w wewnętrznych django. Zaryzykowałbym nawet stwierdzenie, że wymagałoby to poważnego przepisania kodu migracji.Odpowiedzi:
Dzięki komentarzom do mojego pytania przeprowadziłem badania i opracowałem następujące ustalenia.
Korzystanie z wielu baz danych powoduje utworzenie tabeli
django_migrations
podczas korzystania z migracji. Jak wyjaśniadjango_migrations
komentarz Kamila Niski'ego, nie ma opcji rejestrowania migracji tylko w jednej tabeli . Wyraźnie widać to po odczytaniu plikudjango/db/migrations/recorder.py
.Zilustruję przykład z projektem
foo
i aplikacjąbar
wewnątrz projektu. Aplikacjabar
ma tylko jeden modelBaz
.Tworzymy projekt:
Teraz mamy te treści w głównym katalogu projektu:
Mam zwyczaj grupować wszystkie aplikacje w katalogu projektu:
W pliku
foo/settings.py
dostosowujemy ustawienia, aby używać dwóch różnych baz danych, do celów tego przykładu używamysqlite3
:Teraz uruchamiamy migracje:
To uruchamia wszystkie migracje, część
--database=default
jest opcjonalna, ponieważ jeśli nie zostanie określony, Django używa domyślnej bazy danych.Django zastosował wszystkie migracje do domyślnej bazy danych:
Teraz tworzymy model
Baz
:models.py
:zarejestruj aplikację
bar
wINSTALLED_APPS
(foo/settings.py
) i utwórz migracje:Przed uruchomieniem migracji tworzymy
routers.py
wbar
aplikacji:i zarejestruj go w
foo/settings.py
:Teraz naiwnym podejściem byłoby uruchomienie migracji
bar
doremote
bazy danych:Migracje zostały zastosowane do
remote
bazy danych:Kiedy biegniemy:
zostanie wygenerowane następujące ostrzeżenie:
Wszystko wydaje się jednak działać dobrze. To ostrzeżenie nie jest jednak satysfakcjonujące.
Właściwym sposobem byłoby uruchomienie wszystkich migracji dla każdej bazy danych, jak sugerowano w tej odpowiedzi .
Wyglądałoby to tak:
i po utworzeniu migracji dla
bar
:Router upewni się, że tabela
bar_baz
jest tworzona tylko wremote
bazie danych, ale Django oznaczy migracje jako zastosowane w obu bazach danych. Także stoły doauth
,admin
,sessions
, itd. Zostaną utworzone tylko wdefault
bazie danych, jak określono wrouters.py
. Tabeladjango_migrations
wremote
bazie danych będzie również zawierać rekordy dla tych migracji.To długie czytanie, ale mam nadzieję, że rzuci nieco światła na to, moim zdaniem, nie do końca wyjaśnione zagadnienie w oficjalnej dokumentacji .
źródło