Подтвердить что ты не робот

Ошибка базы данных в Django: не может reset из-за зависимостей

Я пытаюсь создать reset базу данных в 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 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 

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

4b9b3361

Ответ 1

Простой способ полностью reset база данных Django использует django-extensions.

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

python manage.py reset_db

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Используя подробности в других ответах, я создал функцию 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

И это будет выполнено!

Ответ 5

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