Reset Database in Django

- Reset the SQLite3 Database in Django
- Reset the Whole Database in Django
- Reset an App Database Tables in Django
When working with databases, we often end up in situations where we have to reset the whole database. The possible reasons could be the addition or removal of some database tables, changes in the database design, issues on logic and relationships, or the database got populated with too much useless data. Whatever the case may be, Django makes it really easy to deal with this problem.
Moreover, Django provides us with few commands that can handle this for us. One of these commands can reset database in Django, and we’re here to demonstrate how you can use it.
Reset the SQLite3 Database in Django
If you’re using the SQLite3 Database for your Django project and you have to reset it, follow the steps below:
Delete the db.sqlite3 file. If this file contains important data, you might want to settle a backup for those.
Delete all the migrations folder inside all the Django applications.
Make migrations for all the Django applications using the python manage.py makemigrations command. There might be instances where migrations are not made for the applications; in this case, add the application names to this command like this python manage.py makemigrations MyAppOne MyAppTwo MyAppThree .
Lastly, migrate the migrations using this command: python manage.py migrate .
Reset the Whole Database in Django
If we have to reset the whole database completely, we will use the following command: (Note: After using this code, all the existing superusers will be deleted as well.)
python manage.py flush
Reset an App Database Tables in Django
If we have to remove the database tables of a Django application, we will use the command below. The following code reverses all the migrations for that particular application:
python manage.py migrate MyApp zero
Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.
Related Article — Django Database
Очистка базы данных в приложении Django
Все приводит к одному и тому же — ошибка по поводу несуществующей таблицы auth.users.
Отслеживать
задан 29 мая 2017 в 1:32
438 4 4 серебряных знака 13 13 бронзовых знаков
Вам в итоге полностью надо очистить или не очень полностью? Если не очень, то по какому принципу вы будете выбирать таблицы, подлежащие удалению?
29 мая 2017 в 1:49
Ну так создай эту таблицу, если удалил ее
29 мая 2017 в 2:04
@m9_psy полностью. То есть, полная очистка БД.
29 мая 2017 в 14:39
Не указана база данных, по ошибке похоже что mysql. Отключите проверку связей перед удалением, и проблем не будет. SET foreign_key_checks = 0;
1 июн 2017 в 18:53
Решение только для MyISAM и подобных, где файл на диске = таблица. Можно сразу удалить физически файл базы данных. Так же как и перенести с компьютера на компьютер можно не через дамп, а через файлы.
1 июн 2017 в 18:55
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
К слову, помогал только полный дроп базы. Дело было в том, что структура БД была довольно сложной и запутанной, со множеством Foreign Key. Из-за этого при попытке аккуратно почистить базу появлялась проблема на этапе проверки целостности при удалении значений с Foreign Key.
Django — Урок 046. Сброс миграций в проекте
В процессе разработки проекта на Django мы можем столкнуться с неприятной ситуацией, когда некоторые пакеты и модули были удалены и, соответственно, модели из этих пакетов больше не использовались. Но в то же время сквош миграций приложений не позволяет удалить эти пакеты, так как миграции имеют много циклических зависимостей. В результате удаление ненужных пакетов становится довольно сложной задачей. Так как разрешение таких зависимостей становится нетривиальной задачей. Для меня таким неприятным пакетом был Django CKEditor, который присутствовал почти везде. В итоге этот пакет из-за миграций довольно долго оставался в списке requirements.txt, хотя по факту на сайте вообще не использовался. Чтобы избавиться от таких зависимостей миграций, нужно удалить все миграции, при этом не удаляя контент, который был создан этими миграциями. А затем создать новую начальную миграцию и применить ее к базе данных также без внесения новых изменений в структуру базы данных.
Как это сделать?
- Вернуть все миграции в нулевое состояние с параметром fake. Это означает, что информация о миграции будет удалена, но содержимое не изменится.
python manage.py migrate app zero --fake
git rm "app/migrations/*"
python manage.py makemigrations app
python manage.py migrate app --fake
Вывод
Внимательно применяйте этот подход к настройке миграций и лучше создайте новую миграцию на тестовом сервере, чтобы убедиться, что вы все делаете правильно и база данных не сломается.
При этом на тестовом сервере можно создать новую миграцию и добавить ее в репозиторий git.
Затем на рабочем сервере вам нужно будет сделать следующее.
python manage.py migrate app zero --fake git pull python manage.py migrate app --fake
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Рекомендуемые статьи по этой тематике
По статье задано0 вопрос(ов)
Подписка на обсуждение 1
Подписка на раздел 176Вам это нравится? Поделитесь в социальных сетях!
Django как очистить базу данных
Рассмотрим пример с редактированием и удалением объектов модели на примере модели Person:
from django.db import models class Person(models.Model): name = models.CharField(max_length=20) age = models.IntegerField()Обновление
save()
Для обновления объекта также применяется метод save() :
bob = Person.objects.get(id=2) bob.name = "Bob" bob.save()В этом случае Django полностью обновляет объект, все его свойства, даже если мы их не изменяли. Чтобы указать, что нам надо обновить только определенные поля, следует использовать параметр update_fields :
from .models import Person bob = Person.objects.get(id=1) bob.name = "Robert" bob.save(update_fields=["name"])Это позволит повысить производительность.
update()
Другой способ обновления объектов представляет метод update() (и его асинхронная версия aupdate() ) в сочетании с методом filter , которые вместе выполняют один запрос к базе данных:
from .models import Person number = Person.objects.filter(id=1).update(name="Mike") print(number) # количество обновленных строкВ данном случае у объектов с устанавливаем для поля name значение "Mike". Метод возвращает количество обновленных строк.
Если нам не надо получать обновляемый объект, то данный способ позволит нам увеличить производительность взаимодействия с бд.
Также можно установить и большое количество полей:
Person.objects.filter(id=1).update(name="Mike", age = 33)Иногда бывает необходимо изменить значение столбца в бд на основании уже имеющегося значения. В этом случае мы можем использовать функцию F() :
from .models import Person from django.db.models import F Person.objects.all(id=2).update(age = F("age") + 1)В данном случае полю age присваивается уже имеющееся значение, увеличенное на единицу.
При этом важно учитывать, что метод update обновляет все записи в таблице, которые соответствуют условию.
Если надо обновить вообще все записи, вне зависимости от условия, то необходимо комбинировать метод update с методом all() :
from .models import Person from django.db.models import F Person.objects.all().update(name="Mike") Person.objects.all().update(age = F("age") + 1)update_or_create()
Метод update_or_create (и его асинхронная версия aupdate_or_create() ) обновляет запись, а если ее нет, то добавляет ее в таблицу:
values_for_update= bob, created = Person.objects.update_or_create(id=2, defaults = values_for_update)Метод update_or_create() принимает два параметра. Первый параметр представляет критерий выборки объектов, которые будут обновляться. Второй параметр представляет объект со значениями, которые получат выбранные объекты. Если критерию не соответствует никаких объектов, то в таблицу добавляется новый объект, а переменная created будет равна True.
bulk_update()
Метод bulk_update() (и его асинхронная версия abulk_update() ) позволяет обновить за один раз набор объектов.
bulk_update(objs, fields, batch_size=None)Первый параметр - obj указывает на обновляемые объекты, а второй параметр - fields представляет обновляемые поля с новыми значениями. Последний параметр - batch_size указывает, сколько объектов обновляется в одном запросе (по умолчанию обновляются все объекты)
from .models import Person first_person = Person.objects.get(id=1) first_person.name = "Tomas" second_person = Person.objects.get(id=2) second_person.age = 29 number = Person.objects.bulk_update([first_person, second_person], ["name", "age"]) print(number) # 2В данном случае у первого объекта обновляется значение поля "name", а у второго - значение поля "age". Поэтому в качестве второго параметра передается список с данными полями. Результатом метода является количество обновленных объектов.
Данный метод имеет некоторые ограничения. В частности, мы не можем обновить значение первичного ключа. Также если в обновляемом наборе есть дубли, то только первое вхождение объекта будет использоваться для обновления.
Удаление
Для удаления мы можем вызвать метод delete() (либо его асинхронную версию adelete() ) у удаляемого объекта:
person = Person.objects.get(id=2) person.delete()Если не требуется получение отдельного объекта из базы данных, тогда можно удалить объект с помощью комбинации методов filter() и delete() :
Person.objects.filter(id=4).delete()Удаление всех данных из таблицы:
Person.objects.all().delete()
