What's the best way to migrate a Django DB from SQLite to MySQL?

42,738

Solution 1

Execute:

python manage.py dumpdata > datadump.json

Next, change your settings.py to the mysql database.

Finally:

python manage.py loaddata datadump.json

Solution 2

After some hard searching I got several problems that I hope future answer looking people will find useful.

my formula is

  1. python manage.py dumpdata > datadump.json
  2. Change settings.py to your mysql
  3. Make sure you can connect on your mysql (permissions,etc)
  4. python manage.py migrate --run-syncdb
  5. Exclude contentype data with this snippet in shell

    python manage.py shell

    from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() quit()

  6. python manage.py loaddata datadump.json

Hope that will help you!

Solution 3

This is a neater way to avoid the ContentType issues described elsewhere:

./manage.py dumpdata --exclude contenttypes --exclude auth.permission --exclude sessions --indent 2 > dump.json

Then:

./manage.py loaddata dump.json

Solution 4

A (fuller) list of the steps I needed for moving from sqlite to MySQL, YMMV:

  1. python manage.py dumpdata > datadump.json
  2. Make sure you can connect on your mysql (permissions, etc)
  3. Make sure you HAVE PRIVILEGES to modify FOREIGN_KEY_CHECKS (I had to install and run my own private instance of mysql for that)
  4. Make sure InnoDB engine is NOT used (use MyISAM in every table) or the next step won't work (failing silently)!
  5. Relax validation by this command (this won't take effect in InnoDB): SET GLOBAL FOREIGN_KEY_CHECKS = 0;
  6. Load django_site.sql table separately (if using contrib.sites)
  7. Change settings.py to your new mysql
  8. python manage.py migrate --run-syncdb
  9. Fix syncdb errors errors by tinkering with the code in /migrations directories of your Django apps and the DB tables as necessary
  10. Exclude contentype data with this snippet (can put it in the main urls.py module): from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() quit()
  11. If need editing json data have to prettify it first: cat datadump.json | python -m json.tool > datadump_pretty.json
  12. python manage.py loaddata datadump.json
  13. Fix any data truncation issues
  14. Add timezone data to the database: mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -D mysql -P 1234 -u root -p --protocol=tcp mysql -P 1234 -u root -p -e "flush tables" --protocol=tcp
  15. Test the site is working without submitting any data
  16. SET GLOBAL FOREIGN_KEY_CHECKS = 1;
  17. Test the rest
Share:
42,738

Related videos on Youtube

GJ.
Author by

GJ.

Updated on July 13, 2020

Comments

  • GJ.
    GJ. almost 4 years

    I need to migrate my db from sqlite to mysql, and the various tools/scripts out there are too many for me to easily spot the safest and most elegant solution.

    This seemed to me nice http://djangosnippets.org/snippets/14/ but appears to be 3 years since getting an update which is worrying..

    Can you recommend a solution that is known to be reliable with Django 1.1.1 ?

    • Ignacio Vazquez-Abrams
      Ignacio Vazquez-Abrams almost 14 years
      I'm guessing you already tried a dumpdata followed by a loaddata?
  • freyley
    freyley over 12 years
    Except sometimes this doesn't work, if you've put unicode data into strings in sql, the fixture creator and mysql don't seem to get along. At least, that's what I came here trying to figure out how to solve.
  • Marcin
    Marcin about 12 years
    Or this doesn't work because of integrity errors...or many other issues.
  • James
    James over 10 years
    Sometimes it raise "... is not JSON serializable"
  • DeltaG
    DeltaG almost 7 years
    What does the contenttype data exclusion do?
  • Carlos Henrique Cano
    Carlos Henrique Cano almost 7 years
    @DeltaG The canonical answer is this. But the best answer I found is: this one
  • user3770447
    user3770447 over 6 years
    That worked for me too. Step 5 was needed for the loaddata command to work.
  • Aniruddh Agarwal
    Aniruddh Agarwal about 5 years
    I am getting this answer django.db.models.fields.related_descriptors.RelatedObjectDoe‌​sNotExist: Problem installing fixture '/home/ubuntu/news-manifest-master/datadump.json': Comment has no content_type.
  • Nairum
    Nairum almost 5 years
    Running dumpdata > datadump.json raises error: CommandError: No installed app with label '>'.
  • florisla
    florisla about 4 years
    This is a useful addition; you could improve this answer by adding more steps to it like the answer by Carlos Henrique Cano.
  • cikatomo
    cikatomo over 3 years
    why run-syncdb? I had to run without that