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

后端 未结 4 1278
你的背包
你的背包 2020-11-28 19:33

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 s

相关标签:
4条回答
  • 2020-11-28 19:50

    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
    0 讨论(0)
  • 2020-11-28 19:56

    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
    
    0 讨论(0)
  • 2020-11-28 20:01

    Execute:

    python manage.py dumpdata > datadump.json
    

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

    Finally:

    python manage.py loaddata datadump.json
    
    0 讨论(0)
  • 2020-11-28 20:15

    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!

    0 讨论(0)
提交回复
热议问题