2010-02-18 2 views
44

Я сделал модель и запустил python manage.py syncdb. Я думаю, что создал таблицу в db. Затем я понял, что неправильно сделал столбец, поэтому я изменил его и выполнил ту же команду, считая, что он закроет старую таблицу и добавит новую.Как отбросить таблицу из SQLite3 в DJango?

Затем я перешел на python manage.py shell и попытался запустить .objects.all(), и он потерпел неудачу, сказав, что столбец не существует.

Я хочу, чтобы очистить старый стол, а затем запустить syncdb снова, но я не могу понять, как это сделать.

+1

Это по дизайну. Синхронизация изменений и капель откроет гигантскую банку червей. Джордж имеет для вас правильный ответ. – Alex

+1

Ofri имеет лучший ответ –

ответ

38

Еще один простой способ сделать это в то время, используя Django 1.4 или ниже, будет

python manage.py reset app_name 

, который падает и воссоздает таблицы, используемые в моделях этого приложения.

Это осуждался в Django 1.3 и больше не доступны из Django 1.5

+0

Это было решение, которое я использовал. Работала отлично. – Alex

+0

sooo happy Я только что нашел это. спасибо – teewuane

+2

«unknown command reset» – user798719

26

получить операторы DROP с

python manage.py sqlclear app_name

попробуйте

python manage.py dbshell

и выполнить оператор удаления проверки

из http://docs.djangoproject.com/en/dev/ref/django-admin/

+0

Это ответ, который я понял, был там. Спасибо. Бывает, что команда сброса работала хорошо. – Alex

+0

это не работает для SQLite3, поскольку он не имеет dbshell – rodling

67

очистить приложение так же просто, как написание:

./manage.py sqlclear app_name | ./manage.py dbshell 

то для того, чтобы восстановить ваши таблицы просто введите:

./manage.py syncdb 
+1

+1 Ницца, отлично работает – cevaris

+0

, наконец, получил решение. Спасибо – ashim888

+2

Больше не работает в Django 1.9+: [Уклонения в Django 1.9] (https://docs.djangoproject.com/en/1.9/internals/deprecation/#deprecation-removed-in-1-9) – prokaktus

28

Ни один из ответов не показывает, как удалить только одну таблицу в приложении. Это не слишком сложно. Команда dbshell регистрирует пользователя в оболочке sqlite3.

python manage.py dbshell 

Когда вы находитесь в оболочке, введите следующую команду, чтобы увидеть структуру вашей базы данных. Это покажет вам все имена таблиц в базе данных (а также имена столбцов в таблицах).

SELECT * FROM sqlite_master WHERE type='table'; 

В общем, Django называет таблицы согласно следующему соглашению: «appname_modelname». Таким образом, SQL-запрос, который выполняет ваши цели будет выглядеть следующим образом:

DROP TABLE appname_modelname; 

Этого должно быть достаточно, даже если таблица имела отношения с другими таблицами. Теперь вы можете выйти из SQLite оболочки, выполнив:

.exit 

Если вы SyncDB снова запустить, Django будет восстановить таблицу в соответствии с моделью. Таким образом, вы можете обновлять таблицы базы данных, не теряя при этом всех данных приложения. Если вы столкнулись с этой проблемой много, подумайте об использовании South - приложения django, которое перенесет ваши таблицы для вас.

+0

У вас есть тем больше основаны на версии базовых принципов. Я просто добавлю, что вам нужно установить sqlite3. – Arcturus

+0

Большое спасибо за упоминание 'dbshell' - раньше я использовал' shell', но после замены моей базы данных для mysql она, похоже, не позволяет мне больше обращаться к моим моделям. «Dbshell» теперь подключает меня прямо к моей оболочке mysql - очень круто. – natureminded

+0

Из ответа Schdiewie Kay: после того, как вы выполните все вышеуказанные шаги, запустите «manage.py migrate --run-syncdb» вместо «syncdb» для Django 1.9+ – NFern

15

У меня была та же проблема.

Для быстрой решимости (если вы не заботитесь о потере таблицы/данные), исправьте файл models.py с нужными типами данных, удалите папку Migration и db.SQLite3 файл,

затем повторно выполнить следующие команды:

  1. питон manage.py мигрировать
  2. питон manage.py makemigrations
  3. питон manage.py мигрировать
  4. питон manage.py создает uperuser (для создания администратора пользователей/PSWD управлять администратора страницы)
  5. питона manage.py runserver
+0

Это было единственное решение, с которым я мог работать. Благодаря! – Philip

+0

Это, кажется, единственное рабочее решение. Очень недооцененный ответ. –

+0

Это был также лучший ответ для меня, спасибо –

1

В Django 1.9, я должен был сделать шаги Kat Руссо, но второй миграции было немного сложнее. Вам необходимо запустить

./manage.py migrate --run-syncdb 
+0

это было полезно – NFern

Смежные вопросы