Який найпростіший спосіб очистити базу даних з CLI за допомогою manage.py в Django?


83

Я використовую Django для створення веб-сайту за допомогою MySQL. Зараз, коли я вчусь, мені дуже часто потрібно змінювати Модель, тому я хочу, щоб усі таблиці очистилися і створили нову таблицю.

Але syncdbне торкається існуючих таблиць. Чи є кращий спосіб вирішити цю проблему?

Відповіді:


152

Якщо ви не дбаєте про дані:

Найкращим способом було б скинути базу даних і запустити її syncdbзнову. Або ви можете запустити:

Для Django> = 1,5

python manage.py flush

Для Django <1,5

python manage.py reset appname

(Ви можете додати --no-inputв кінець команди, щоб вона пропустила інтерактивний рядок.)

Якщо ви дбаєте про дані:

З документів:

syncdb створить таблиці лише для моделей, які ще не встановлені. Він ніколи не видаватиме оператори ALTER TABLE, щоб відповідати змінам, внесеним до класу моделі після встановлення. Зміни в класах моделей та схемах баз даних часто передбачають певну неоднозначність, і в цих випадках Django повинен був би здогадуватися про правильні зміни. Існує ризик втрати важливих даних у процесі.

Якщо ви внесли зміни в модель і хочете змінити таблиці бази даних відповідно, скористайтеся командою sql, щоб відобразити нову структуру SQL і порівняти її із існуючою схемою таблиці, щоб відпрацювати зміни.

https://docs.djangoproject.com/en/dev/ref/django-admin/

Посилання: FAQ - https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

Люди також рекомендують південь ( http://south.aeracode.org/docs/about.html#key-features ), але я не пробував.


4
Південь дійсно, дуже хороший для автоматичної обробки міграцій. Потрібно трохи звикнути, але це економить багато клопоту з видаленням і відтворенням баз даних під час розробки, і це обов’язковий момент, коли ваш сайт працює, і вам потрібно змінити структуру баз даних, поки у вас є цінні дані.
thepeer

11
КОМАНДА СКИДАННЯ ЗНИЖЕНА . У Django 1.5 команда оновлена ​​до flush. спробуйте використати python manage.py flushабо, python manage.py flush --noinputщоб пропустити інтерактивну підказку.
agconti

Південь застарів . Зверніться сюди . І посилання, яке ви тут дали, не працює.
Мукеш Сай Кумар,

Схоже, команда тепер django-admin flushвідповідає документам
Тодд

4

Використовуючи розширення Django , запустіть:

./manage.py reset_db

Очистить таблиці бази даних, а потім запустить:

./manage.py syncdb

Відтворить їх (південь може попросити вас перенести речі).


2
@becko виконай це перше: pip install django-extensions
FacePalm

4

Я думаю, що в документах Django прямо згадується, що якщо намір полягає в тому, щоб знову почати з порожньої БД (що, здається, є наміром OP), то просто скиньте і заново створіть базу даних і повторно запустіть migrate(замість того, щоб використовувати flush):

Якщо ви бажаєте почати з порожньої бази даних і повторно запустити всі міграції, вам слід скинути та відтворити базу даних, а потім запустити міграцію.

Отже, для випадку OP нам просто потрібно:

  1. Видаліть базу даних з MySQL
  2. Відновіть базу даних
  3. Біжи python manage.py migrate

0

Найшвидший (видаляє та створює всі таблиці, включаючи дані):

./manage.py reset appname | ./manage.py dbshell

Увага:

  • Можливо, неправильно працює в Windows.
  • Може зберегти деякі старі таблиці в базі даних

3
resetвже запускає SQL, тому немає необхідності переходити до dbshell. Якщо ви використовуєте sqlresetкоманду, то це просто роздрукує SQL, який ви можете направити в оболонку для виконання, але це непотрібний крок.
Michael Mior

0

Ви можете використовувати бібліотеку Django-Truncate для видалення всіх даних таблиці без руйнування структури таблиці.

Приклад:

  1. Спочатку встановіть django-turncate за допомогою терміналу / командного рядка:
pip install django-truncate
  1. Додайте "django_truncate" до свого INSTALLED_APPS у settings.pyфайлі:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Використовуйте цю команду у своєму терміналі, щоб видалити всі дані таблиці з програми.
python manage.py truncate --apps app_name --models table_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.