Django: What are the best practices to migrate a project from sqlite to PostgreSQL Django: What are the best practices to migrate a project from sqlite to PostgreSQL sqlite sqlite

Django: What are the best practices to migrate a project from sqlite to PostgreSQL


In my experience, dumping & restoring from SQL doesn't work properly.

You should follow this sequence instead:

1. Dump db contents to json

$ ./manage.py dumpdata > dump.json

2. Switch the backend in settings.py

DATABASES = {    # COMMENT OUT:    # 'default': dj_database_url.config(default='sqlite:////full/path/to/your/database/file.sqlite'),    # ADD THIS INSTEAD:    'default': dj_database_url.config(default='postgres://localhost:5432/postgres_db_name'),}

3. Syncdb and migrate the new DB to the same table structure

$ ./manage.py syncdb$ ./manage.py migrate

4. Load the json to the new db.

$ ./manage.py loaddata dump.json

5. Congrats! Now the new data is in your postgres db.


The following is a refinement of Nimo's answer and Stephen's answer for Django 1.7+:

  1. ./manage.py dumpdata --natural-primary --natural-foreign > dump.json
  2. Change DATABASES in settings.py to point to the new (PostgreSQL) db.
  3. ./manage.py migrate
  4. ./manage.py loaddata dump.json

One problem I encountered is that SQLite doesn't seem to actually enforce the maximum length for CharFields. In my case, this made the loaddata step fail. I was able to find (and delete) model instances with too long CharField values via:

MyModel.objects.extra(where=["LENGTH(text) > 20"]).delete()

Once I did this before step 1. above, everything worked.


I've never had to do it but what I would try is.

  1. Stop running servers
  2. python manage.py dumpdata
  3. Alter settings.py to point to the newly created postgres database
  4. python manage.py loaddata