21

Has anyone done this? Is it an easy process? We're thinking of switching over for transactions and because mysql seems to be "crapping out" lately.

3
  • 1) MySql does support transactions (InnoDB) 2) What makes you think MySql is "crapping out" lately? Commented Feb 11, 2011 at 1:13
  • For now reason we'll just start getting tones of these errors: OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction') Also, using South with Django sometimes hurts without real transactions. Commented Feb 11, 2011 at 14:43
  • 1
    MySQL doesn't support schema transactions - which can cause a massive headache for migrations Commented Feb 18, 2013 at 5:20

8 Answers 8

41

Converting MySQL database to Postgres database with Django

First backup your data of the old Mysql database in json fixtures:

$ python manage.py dumpdata contenttypes --indent=4 --natural-foreign > contenttype.json
$ python manage.py dumpdata --exclude contenttypes --indent=4 --natural-foreign > everything_else.json

Then switch your settings.DATABASES to postgres settings.

Create the tables in Postgresql:

$ python manage.py migrate

Now delete all the content that is automatically made in the migrate (django contenttypes, usergroups etc):

$ python manage.py sqlflush | ./manage.py dbshell

And now you can safely import everything, and keep your pk's the same!

$ python manage.py loaddata contenttype.json
$ python manage.py loaddata everything_else.json

Tested with Django==1.8

Sign up to request clarification or add additional context in comments.

6 Comments

Worked perfectly for me with Django==1.11.4
OMG You saved my day... I've been trying to move my data from MySQL to PGSQL over the weekend with pdloader. The tool always gives me a weird error that I don't even know how to start debugging... Your way is just fantastic. Thanks a lot and your answer should be the accepted one!
Thanks! I also has success here with my django project, but was getting duplicate PK key errors until I commented out all my post_save.connect() callbacks (which were creating additional entries).
Also works great for moving data from PGSQL to MySQL! Didn't work in one fixture before...Django 3.2... Thanks a lot! :)
I tested this on Django v5.1.2 and it works, thank you! Only thing I had to add when exporting data, I had to use -Xutf8 flag to get around some character mapping problems. So the dump command was python -Xutf8 manage.py dumpdata --exclude contenttypes --indent=4 --natural-foreign > everything_else.json
|
3

I just used this tool to migrate an internal app and it worked wonderfully. https://github.com/maxlapshin/mysql2postgres

Comments

2

You can do that using Django serializers to output the data from MySQL's format into JSON and then back into Postgres. There are some good artices on internet about that:

Migrating Django from MySQL to PostgreSQL the Easy Way

Move a Django site to PostgreSQL: check

Comments

1

I've never done it personally, but it seems like a combination of the dumpdata and loaddata options of manage.py would be able to solve your problem quite easily. That is, unless you have a lot of database-specific things living outside the ORM such as stored procedures.

2 Comments

that work, but sometime there are need truncate all tables just created by syncdb
dump data loads the entire dataset into memoery before serializing it - this is a problem for a large data set. ofbrooklyn.com/2010/07/18/… shows how to chunk this process to avoid crashing your server.
0

I've not done it either. I'd first follow this migration guide, there is a MySql section which should take care of all your data. Then django just switch the mysql to postgre in the settings. I think that should be ok.

I found another question on stackoverflow which should help with the converting mysql to postgre here.

Comments

0
  1. python manage.py dump.data >> data.json

  2. Create database and user in postrgesql

  3. Set your just created database in postrgesql as default database in django settings or use param --database=your_postrgesql_database next steps
  4. Run syncdb for create tables.

    python syncdb [--database=your_postrgesql_database] --noinput

  5. Create dump without data, drop all tables and load dump. Or truncate all tables (table django_content_type whith data which can be not equals your old data - it is way to many errors). At this step we need empty tables in postgresql-db.

  6. When you have empty tables in postgresql-db just load your data:

    python manage.py loaddata data.json

And be fun!

Comments

0

I wrote a Django management command that copies one database to another: https://gist.github.com/mturilin/1ed9763ab4aa98516a7d

You need to add both database in the settings and use this command:

./manage.py copy_db from_database to_database app1 app2 app3 --delete --ignore-errors

What cool about this command is that it recursively copy dependent objects. For example, if the model have 2 foreign keys and two Many-to-Many relationships, it will copy the other objects first to ensure you won't get foreign key violation error.

1 Comment

broken git link
0

I just went through this exercise and the answer provided by michael-van-de-waeter here is perfect.

However, I would like to add the following needed steps:

  1. I had to first delete ContentType following this thread:

python manage.py shell

from django.contrib.contenttypes.models import ContentType

ContentType.objects.all().delete()
  1. I had also to append a square bracket to the data json:

    echo ']' >> everything_else.json

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.