我们已对 Django1.6 app完成了数据库从mysql到PostgreSQL的迁移如果你的环境很干净这个过程就会很简单青铜峡SEO这个过程就会很简单只要允许syncdb 或者 migrate创建表truncating表中的数据然后运行dumpdata 和loaddatamanagement命令就完成了。
第一步在你的PostgreSQL数据库中创建一个空的实例:
第二步在你的Django中给创建的数据库加上配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dbname', 'USER': 'dbuser', 'PASSWORD': 'dbpass', 'HOST': 'mysql.example.com', 'PORT': '', }, 'postgresql': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'dbname', 'USER': 'dbuser', 'PASSWORD': 'dbpass', 'HOST': 'postgresql.example.com', 'PORT': '', }}这样我们就指定了以后名称操作的是哪个数据库。
第三步在PostgreSQL实例中创建表
在PostgreSQL中运行syncdb 和 migrations这个过程并没有初始数据。
第四步truncate新创建的表
第五步从mysql中备份数据到JSON 文件中
Django 有一个dumpdata命令用它可以生成一个数据库无关的备份默认格式是JSON。
python manage.py dumpdata --all --natural --indent=4 dbname.json这里的 -all 参数是为了确保你在导出数据的过程中有可能有你自己的过滤和修改数据的需求-natural 参数告诉Django使用natural keys(如果可用的话) –indent 参数是为了使输出更加可读。
你也许想只导出特定的apps里的数据或者只导出一个celery logs 这样的话你就可以使用 –exclude参数例如:
python manage.py dumpdata --all --natural --exclude=djcelery --exclude=search.SearchLog --indent=4 dbname.json第六步加载JSON数据到PostgreSQL数据库中
python manage.py loaddata dbname.json --database=postgresql基本上迁移的过程就结束了现在你只要修改一下你的数据库配置然后是PostgerSQL成为默认的数据库。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'dbname', 'USER': 'dbuser', 'PASSWORD': 'dbpass', 'HOST': 'postgresql.example.com', 'PORT': '', }}在我们的情况下我们的数据库不是很干净我们的数据库是给一个PHP的遗留代码创建的我们现在还在一步步摆脱它我们有一些Django之外的数据库并且都在被程序使用为了把这些迁移到PostgreSQL中我使用了这个工具过程还是简单一些。
注意事项
Django 信号
你可能想禁止这些当一个数据库记录创建的时候你的程序可能就会发送给你的用过邮件为了不打扰它们在加载数据的时候你需要保证它们被禁止了Here’s one way to handle this 这里我们使用了检测器保证信号不会别触发。
约束(像非空unique 和外键)
我们的数据库迁移过程碰到了很多这种问题比如一个外键约束但是其他的一个表不存在了有一下空置的记录但是模型定义中不允许比如复制的过程中存在unique约束这些都需要手动干预我必须使用SQL语句清除掉这些Dumpdata 和loaddata 将会检测到这些所以你的数据库必须是一个干净的一致的状态。
主键的硬编码
这很痛苦因为在我们的测试 suite中到处都是主键的硬编码所以很多测试到失败了因为使用PostgreSQL 处理的序列的方法和mysql不太一样我必须手动修改700多个测试用例大都是很简单的修改但是很消耗时间。
原生SQL语句
幸运的是我们只有一处使用了原生sql语句有些mysql中的函数在PostgreSQL中不适用我们只用修改为在PostgreSQl中相同功能的函数就可以了。
大小写敏感