Mam problem z ładowaniem urządzeń Django do mojej bazy danych MySQL z powodu konfliktów contenttypes. Najpierw próbowałem zrzucić dane tylko z mojej aplikacji w następujący sposób:
./manage.py dumpdata escola > fixture.json
ale ciągle pojawiały się problemy z brakującymi kluczami obcymi, ponieważ moja aplikacja „escola” używa tabel z innych aplikacji. Dodawałem kolejne aplikacje, aż doszedłem do tego:
./manage.py dumpdata contenttypes auth escola > fixture.json
Teraz problemem jest następujące naruszenie ograniczenia, gdy próbuję załadować dane jako urządzenie testowe:
IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")
Wygląda na to, że problem polega na tym, że Django próbuje dynamicznie odtworzyć typy zawartości z różnymi wartościami klucza podstawowego, które kolidują z wartościami klucza podstawowego z urządzenia. Wygląda na to, że jest to to samo, co błąd udokumentowany tutaj: http://code.djangoproject.com/ticket/7052
Problem w tym, że zalecanym obejściem jest zrzucenie aplikacji contenttypes, którą już robię !? Co daje? Jeśli to robi różnicę, mam pewne uprawnienia do modelu niestandardowego, jak udokumentowano tutaj: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions
-e contenttypes -e auth.permission
z--natural
? Po prostu próbowałem bez--natural
opcji i zadziałało. Również dokumentacja tutaj mówi , że należy użyć tej opcji, jeśli DUMPINGauth.permission
icontenttypes
.ContentType
iPermission
nie ma gwarancji, że otrzyma taki sam identyfikator, jak wcześniej. Twój zrzut danych zawiera identyfikatory, które mogą odnosić się do różnych obiektów w innej bazie danych, do której będziesz ładować dane. Może to zadziałać z jednego z następujących powodów: 1) twoje dane nie miały żadnego odniesienia do tych obiektów 2) oryginalne identyfikatory Permission / ContentTypes zostały zachowane 3) twoje załadowane dane powiodły się, ale faktycznie masz uszkodzone dane z powodu obiektów odnosząc się do niewłaściwych obiektów i jeszcze o tym nie wiesz--natural
jest teraz przestarzała na rzecz--natural-foreign
(i--natural-primary
)manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
--natural
został całkowicie usunięty, a nie tylko przestarzały. Użyj--natural-foreign
lub--natural-primary
zamiast.Tak, to naprawdę irytujące. Przez chwilę omijałem to, wykonując „manage.py reset” w aplikacji contenttypes przed załadowaniem urządzenia (aby pozbyć się automatycznie generowanych danych contenttypes, które różniły się od zrzuconej wersji). To zadziałało, ale w końcu miałem dość kłopotów i całkowicie porzuciłem urządzenia na rzecz prostych zrzutów SQL (oczywiście, wtedy tracisz przenośność DB).
aktualizacja - najlepszą odpowiedzią jest użycie
--natural
flagidumpdata
, zgodnie z poniższą odpowiedzią. Ta flaga jeszcze nie istniała, kiedy pisałem tę odpowiedź.źródło
Spróbuj pominąć typy zawartości podczas tworzenia urządzenia:
U mnie zadziałało w podobnej sytuacji w przypadku testów jednostkowych, Twój wgląd w typy zawartości naprawdę pomógł!
źródło
Odpowiedzi tutaj wszystkie stare ... Od 2017 roku najlepszą odpowiedzią jest:
źródło
Nie używałem MySQL, ale zamiast tego importowałem niektóre dane z aktywnego serwera do sqlite. Wyczyszczenie
contenttypes
danych aplikacji przed wykonaniemloaddata
załatwiło sprawę:I wtedy
źródło
Rozwiązałem ten problem w moich przypadkach testowych, resetując aplikację contenttypes z testu jednostkowego przed załadowaniem pliku zrzutu. Carl zasugerował to już przy użyciu
manage.py
polecenia, a ja robię to samo tylkocall_command
metodą:Moje
full_test_data.json
urządzenie zawiera zrzut aplikacji contenttypes, który odpowiada pozostałym danym testowym. Resetowanie aplikacji przed załadowaniem zapobiega zduplikowaniu kluczaIntegrityError
.źródło
To działa dla mnie. Tutaj wykluczam wszystko, co dotyczy rzeczywistych modeli.
źródło
Aby przedstawić dowolny klucz obcy i relacje „wiele do wielu”, należy użyć kluczy naturalnych. Ponadto dobrym pomysłem może być wykluczenie
session
tabeli wsessions
aplikacji ilogentry
tabeli wadmin
aplikacji.Django 1.7+
Django <1.7
Zgodnie z dokumentacją Django ,
--natural
został wycofany w wersji 1.7, więc--natural-foreign
zamiast tego należy użyć tej opcji .Możesz również pominąć klucz podstawowy w zserializowanych danych tego obiektu, ponieważ można go obliczyć podczas deserializacji, przekazując
--natural-primary
flagę.źródło
ulegnie zmianie
do
A urządzenie na
TestCase
razie działaźródło
Django 2.2.5
pomogło mi
źródło
Podam inną możliwą odpowiedź, którą właśnie odkryłem. Może to pomoże OP, może pomoże komuś innemu.
Mam tabelę relacji wiele do wielu. Ma klucz podstawowy i dwa klucze obce do innych tabel. Stwierdziłem, że jeśli mam wpis w urządzeniu, którego dwa klucze obce są takie same jak inny wpis już w tablicy z innym pakietem, zakończy się niepowodzeniem. Tabele relacji M2M mają „unikalne razem” dla dwóch kluczy obcych.
Tak więc, jeśli jest to relacja M2M, która się zrywa, spójrz na dodawane klucze obce, spójrz na swoją bazę danych, aby zobaczyć, czy ta para FK jest już wymieniona pod inną PK.
źródło
To naprawdę irytujące… Za każdym razem mnie to ugryza.
Próbowałem zrzucić dane z --exclude contenttypes i --natural, zawsze mam problemy.
To, co działa najlepiej, to po prostu wykonanie pliku
truncate table django_content_type;
po synchronizacji, a NASTĘPNIE załadowanie danych.Oczywiście dla automatycznego ładowania initial_data.json jesteś fallball.
źródło
Czasami napotkałem podobny błąd. Okazało się, że próbowałem załadować urządzenia przed utworzeniem niezbędnych tabel. Więc zrobiłem:
I działało jak urok
źródło
W moim przypadku zrzuciłem dane z
auth
(./manage.py dumpddata auth > fixtures/auth.json
), aby użyć urządzenia do celów testowych.Rozwój był kontynuowany i usunąłem większość modeli, które zdefiniowałem w
models.py
i wtedy zacząłem widzieć ten irytujący problem.Moim rozwiązaniem było ponowne zregenerowanie urządzenia auth.json. Ten usunął wiele wpisów
auth.permission
związanych ze starymi modelami, które miałem.źródło
Próbowałem każdej metody z góry, nic nie działało dla mnie. Muszę wykluczyć pełny model uwierzytelniania i działa dobrze.
źródło