What is the easiest way to clear a database from the CLI with manage.py in Django?
PythonMysqlDjangoDjango 1.3Python 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:
-
Drop the database from MySQL
-
Recreate the database
-
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:
- First, install django-turncate using your terminal/command line:
pip install django-truncate
- Add "django_truncate" to your INSTALLED_APPS in the
settings.py
file:
INSTALLED_APPS = [
...
'django_truncate',
]
- 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