2011-01-29 11 views
5
$ py manage.py migrate turkey 
Running migrations for turkey: 
- Migrating forwards to 0001_initial. 
> turkey:0001_initial 
! Error found during real run of migration! Aborting. 

! Since you have a database that does not support running 
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations. 

! You *might* be able to recover with: = DROP TABLE `turkey_demorecs` CASCADE; [] 

! The South developers regret this has happened, and would 
! like to gently persuade you to consider a slightly 
! easier-to-deal-with DBMS. 
! NOTE: The error which caused the migration to fail is further up. 

Z jakiegoś powodu otrzymuję to, gdy próbuję. Ale moje inne konfiguracje są w MyISAM.Czy narzędzie Django na południe (narzędzie migracji) działa na innodb?

Dlaczego to nie działa w Innodb?

Odpowiedz

1

Tak, południe obsługuje InnoDB. Czy możesz usunąć zawartość folderu "migracje" i ponownie uruchomić schematamigration, przeprowadzić migrację i opublikować wyniki i zawartość pliku 0001_initial? PS: Upewnij się, że masz wcześniej utworzony folder migracji lub kontrolę źródła.

rm -fr app/migrations/* 
./manage.py schemamigration app --initial 
./manage.py migrate app 
3

Zobacz także https://code.djangoproject.com/wiki/AlterModelOnSyncDB

miałem ten sam rodzaj błędu zdarzy mi się podczas pracy z konfiguracji mysql którego domyślnym silnikiem przechowywania tabela MyISAM i chciałem użyć InnoDB (stosując przepis znajdujący się w powyżej link, użyliśmy sygnału post_syncdb, aby uruchomić kod konwersji). Jednakże, używając South do tworzenia nowych tabel, zostały one najpierw utworzone przy użyciu silnika MyISAM, a następnie przekształcone później. Błędnie wierzyłem, że tabele InnoDB nie robią tego, co powinny, kiedy to faktycznie były MyISAM; ponieważ tabela zostały przekształcone przez sygnał, każdy błąd migracja nie doprowadzi do wycofania zastosowania: -/

Jeśli trzeba użyć lub tworzenie tabel InnoDB gdzie domyślnie jest MyISAM, to być rozwiązane z:

# add at the beginning of your migration 
if db.backend_name == 'mysql': 
    db.execute('SET storage_engine=INNODB') 

lub jeśli nie przeszkadza trafienie Osiągi:

# add this to settings.py 
DATABASE_OPTIONS = { 
    "init_command": "SET storage_engine=INNODB", # XXX: performance hit... 
} 
+0

Czy jesteś pewien? Nie mamy nawet oryginalnego błędu. – Tobu

+0

Miałem South dać mi taki sam "użyj łatwiejszy w obsłudze-z DBMS" wiadomość podczas pracy z mysql skonfigurowany do używania MyISAM domyślnie. Nie mogę być pewny, ale jest to prawdopodobnie ten sam problem. – dnozay

4

InnoDB ma ograniczeń na klucze zagranicznych, które zapewniają, że nie łamią modelu bazy danych podczas wykonywania migracji. (Patrz http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html)

MyISAM nie posiada natywne wsparcie dla ograniczeń (choć wydaje się, można zaimplementować to jeśli zdecydujesz się zrobić zrobić http://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html)

Ponieważ MyISAM nie jest sprawdzenie relacji FK, nie dostać błąd. InnoDB robi jednak czek i wygląda na to, że masz problem z migracją.

1

Można spróbować dodać do swojej pierwszej migracji:

if db.backend_name == 'mysql': 
    db.execute('SET foreign_key_checks=0') 

ten będzie wyłączyć kluczy obcych wyboru.

Nie trzeba jej przywracać do 1, ponieważ jest to zmienna sesji.

Nawiasem mówiąc, nie działa, jeśli na początku metody ustawiono wartość 0, a następnie 1 na końcu metody migracji, ponieważ południe generuje je za pomocą instrukcji SQL, ale wykonuje je po ich powrocie.

Powiązane problemy