What is the easiest way to clear a database from the CLI with manage.py in Django?

PythonMysqlDjangoDjango 1.3

Python Problem Overview


I am using Django to build a website with MySQL. Now as I am learning so I need to change the Model very often so I want that all tables get cleared and new table get created.

But syncdb doesn't touch existing tables. Is there any better way to handle this problem?

Python Solutions


Solution 1 - Python

If you don't care about data:

Best way would be to drop the database and run syncdb again. Or you can run:

For Django >= 1.5

python manage.py flush

For Django < 1.5

python manage.py reset appname

(you can add --no-input to the end of the command for it to skip the interactive prompt.)

If you do care about data:

From the docs:

> syncdb will only create tables for > models which have not yet been > installed. It will never issue ALTER > TABLE statements to match changes made > to a model class after installation. > Changes to model classes and database > schemas often involve some form of > ambiguity and, in those cases, Django > would have to guess at the correct > changes to make. There is a risk that > critical data would be lost in the > process. > > If you have made changes to a model > and wish to alter the database tables > to match, use the sql command to > display the new SQL structure and > compare that to your existing table > schema to work out the changes.

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

Reference: FAQ - https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

People also recommend South ( http://south.aeracode.org/docs/about.html#key-features ), but I haven't tried it.

Solution 2 - Python

Using Django Extensions, running:

./manage.py reset_db

Will clear the database tables, then running:

./manage.py syncdb

Will recreate them (south may ask you to migrate things).

Solution 3 - Python

I think Django docs explicitly mention that if the intent is to start from an empty DB again (which seems to be OP's intent), then just drop and re-create the database and re-run migrate (instead of using flush):

> If you would rather start from an empty database and re-run all > migrations, you should drop and recreate the database and then run > migrate instead.

So for OP's case, we just need to:

  1. Drop the database from MySQL

  2. Recreate the database

  3. Run python manage.py migrate

Solution 4 - Python

Quickest (drops and creates all tables including data):

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

Caution:

  • Might not work on Windows correctly.
  • Might keep some old tables in the db

Solution 5 - Python

You can use the Django-Truncate library to delete all data of a table without destroying the table structure.

Example:

  1. First, install django-turncate using your terminal/command line:
pip install django-truncate
  1. Add "django_truncate" to your INSTALLED_APPS in the settings.py file:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Use this command in your terminal to delete all data of the table from the app.
python manage.py truncate --apps app_name --models table_name

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMirageView Question on Stackoverflow
Solution 1 - PythonmanojldsView Answer on Stackoverflow
Solution 2 - PythonmrmagooeyView Answer on Stackoverflow
Solution 3 - PythonAnupamView Answer on Stackoverflow
Solution 4 - PythonUdiView Answer on Stackoverflow
Solution 5 - PythonMahbub Ul IslamView Answer on Stackoverflow