Проблема с базой данных в Django: невозможно сбросить из-за зависимостей - PullRequest
16 голосов
/ 09 ноября 2009

Я пытаюсь сбросить базу данных в Django, используя:

python manage.py reset app

но получите следующую ошибку:

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.

Вот как выглядит мой файл models.py:

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

Я понял, что мне нужно использовать команду DROP ... CASCADE в SQL, которая удаляет и воссоздает базу данных (вывод django-admin.py).

Но как я могу редактировать этот SQL напрямую из models.py?


UPDATE

ОК, я разобрался, как удалять таблицы вручную (база данных postgres), заметил это здесь для тех, у кого такая же проблема:

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

Хотелось бы узнать, есть ли у кого-нибудь лучший способ сделать это, хотя бы:)

Ответы [ 5 ]

4 голосов
/ 14 января 2010

Я использую небольшой конвейер Unix, который добавляет CASCADE ко всем операторам DROP.

python manage.py sqlreset myapp | sed 's/DROP TABLE \(.*\);/DROP TABLE \1 CASCADE;/g' | \
psql --username myusername mydbname
4 голосов
/ 09 сентября 2010

Простой способ полного сброса базы данных Django - это django-extensions .

Имеет команду reset_db, которая поддерживает все стандартные базы данных Django по умолчанию.

python manage.py reset_db

Если вы используете Django 1.2+, вы должны явно указать базу данных, которую хотите сбросить. Если ваш проект использует только одну базу данных, вам, вероятно, следует установить --router=default

2 голосов
/ 10 ноября 2009

Проблема DROP TABLE CASCADE заключается в том, что он просто удаляет внешние ключи в связанных таблицах - после syncdb это отношение не воссоздается. Я не нашел способа воссоздать таблицы конкретной модели, поэтому я перезагружаю все приложение путем воссоздания схемы:

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

Это должно работать только с базой данных, которая поддерживает схему, например * 1004 PostgreSQL *

1 голос
/ 06 сентября 2011

Используя подробности в других ответах, я создал функцию bash, которую поместил в ~ / .bash_profile (в Mac OS X).

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

Затем просто запустите эту команду в терминале из корневого каталога кода (так что путь к mainsite / manage.py имеет смысл).

django_reset myappA myappB

И это исполнится!

0 голосов
/ 12 февраля 2014

Я нашел другой способ. Я использую sqlite3, который поставляется по умолчанию в Django. Чтобы восстановить таблицу по умолчанию. python manage.py flush --database = default после этого вам нужно будет снова использовать команду syncdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...