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+:
./manage.py dumpdata --natural-primary --natural-foreign > dump.json
- Change
DATABASES
insettings.py
to point to the new (PostgreSQL) db. ./manage.py migrate
./manage.py loaddata dump.json
One problem I encountered is that SQLite doesn't seem to actually enforce the maximum length for CharField
s. 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.
- Stop running servers
- python manage.py dumpdata
- Alter settings.py to point to the newly created postgres database
- python manage.py loaddata