2009-11-09 15 views
16

próbuję przywrócić bazy danych w Django przy użyciu:Database kłopoty w Django: nie można przywrócić ze względu na zależności

python manage.py reset app 

ale pojawia się następujący błąd:

Error: Error: app couldn't be reset. Possible reasons: 
    * The database isn't running or isn't configured correctly. 
    * At least one of the database tables doesn't exist. 
    * The SQL was invalid. 
Hint: Look at the output of 'django-admin.py sqlreset app'. That's the SQL this command wasn't able to run. 
The full error: cannot drop table app_record because other objects depend on it 
HINT: Use DROP ... CASCADE to drop the dependent objects too. 

Jest co mój plik models.py wygląda następująco:

class Record(models.Model): 
    name = models.CharField(max_length=50, db_index=True) 
    year = models.IntegerField(blank=True, null=True) 
    def __unicode__(self): 
     return self.name 

class Class(models.Model): 
    record = models.ForeignKey(Record) 
    def __unicode__(self): 
     return self.id 

mam, że muszę użyć polecenia DROP ... kaskady w SQL, która usuwa i rec reates bazy danych (dane wyjściowe django-admin.py).

Ale jak mogę edytować ten SQL bezpośrednio z models.py?


UPDATE

OK, zorientowali się, jak usunąć tabele ręcznie (baza danych jest PostgreSQL), zauważyli go tutaj dla każdego, kto ma ten sam problem:

python manage.py dbshell 
# drop table app_record cascade; 
# \q 
python manage.py reset app 

Would nadal lubię wiedzieć, czy ktoś ma lepszy sposób to zrobić, ale :)

+0

Jakie polecenie wpisujesz, aby to uzyskać? 'python manage.py reset app'? Czy próbujesz zresetować konkretną tabelę? –

+0

Niestety - tak, "aplikacja do resetowania Pythona do zarządzania.py". – Richard

+1

Prostym rozwiązaniem byłoby po prostu ręczne użycie komendy DROP ... CASCADE, a następnie odtworzenie bazy danych ... czy ktoś może mi podać przykład tego, jak to zrobić? – Richard

Odpowiedz

4

Prostym sposobem na pełne zresetowanie bazy danych Django jest użycie django-extensions.

Posiada polecenie reset_db, które obsługuje wszystkie domyślne bazy danych Django.

python manage.py reset_db 

Jeśli używasz Django 1.2+ należy wyraźnie określić bazę danych, którą chcesz przywrócić. Jeśli twój projekt korzysta tylko z jednej bazy danych, prawdopodobnie powinieneś ustawić --router=default

+0

W rzeczywistości nie działa to również w udostępnianej bazie danych Heroku (w ten sposób natrafiłem na ten problem). – Alper

+2

Pytanie prosi o zresetowanie aplikacji, a nie całej bazy danych. To nie jest dobra odpowiedź w mojej opinii. –

2

Problem DROP TABLE CASCADE jest to, że po prostu usunąć fo klawisze reign w powiązanych tabelach - po syncdb relacja ta nie jest odtwarzana. nie znalazłem sposób, aby odtworzyć tabelach konkretny model, więc mam resetowanie całej aplikacji poprzez odtworzenie schematu:

DROP SCHEMA public CASCADE; 
    CREATE SCHEMA "public" AUTHORIZATION "owner of database"; 

To powinno działać tylko z bazy danych, który obsługuje schemat, na przykład postgresql

4

Używam małego potoku unixa, który dodaje CASCADE do wszystkich instrukcji DROP.

python manage.py sqlreset myapp | sed 's/DROP TABLE \(.*\);/DROP TABLE \1 CASCADE;/g' | \ 
psql --username myusername mydbname 
+1

To jest niesamowite. Jako dodatek można użyć 'manage.py dbshell' zamiast' psql --username myusername mydbname'. –

1

Używając szczegółów w innych odpowiedziach, stworzyłem funkcję bash, którą wpadłem do ~/.bash_profile (na Mac OS X).

django_reset() { python mainsite/manage.py sqlreset "$*" | sed 's/DROP TABLE \(.*\);/DROP TABLE \1 CASCADE;/g' | mainsite/manage.py dbshell ; } 

Następnie wystarczy uruchomić to polecenie w terminalu z katalogu głównego (tak aby ścieżka do pliku mainsite/manage.py miała sens).

django_reset myappA myappB 

i będzie to wykonać!

0

Znalazłem inny sposób. Używam programu sqlite3, który jest domyślnie dostępny w Django. Aby zresetować tabelę do wartości domyślnych. zarządzanie python.py flush --database = default po tym będziesz musiał ponownie użyć polecenia syncdb.

Powiązane problemy