将Django使用的数据库从MySQL迁移到PostgreSQL的教程


Posted in Python onApril 11, 2015

我们已对 Django1.6 app完成了数据库从mysql到PostgreSQL的迁移,如果你的环境很干净,这个过程就会很简单,只要允许syncdb 或者 migrate创建表,truncating表中的数据,然后运行dumpdata 和loaddatamanagement命令就完成了。
第一步,在你的PostgreSQL数据库中创建一个空的实例:
 

CREATE DATABASE dbname OWNER rolename;

第二步,在你的Django中给创建的数据库加上配置

在setting.py 中,我们这样配置:
 

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实例中创建表

python manage.py syncdb --migrate --no-initial-data --database=postgresql

在PostgreSQL中运行syncdb 和 migrations,这个过程并没有初始数据。
第四步,truncate新创建的表

尽管我们在先前的步骤中指定了 ?no-initial-data ,为了防止在迁移过程中用户的自定义数据在未知情况下加入了表中,我们最好还是truncate一下新建的表,我们可以生成一个SQL脚本,运行:
 

python manage.py sqlflush --database=postgresql
第五步,从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中相同功能的函数就可以了。

大小写敏感

字符串比较在PostgreSQL中是大小写敏感的,但是在Mysql中不是,我在迁移非Django数据表过程中也遇到了一些问题,索引创建的时候,命令需要id,但是字段的名字是Id(字母I),我只要重命名为id就可以了。

Python 相关文章推荐
Python运行的17个时新手常见错误小结
Aug 07 Python
Python内置函数的用法实例教程
Sep 08 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
django从请求到响应的过程深入讲解
Aug 01 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
python使用百度文字识别功能方法详解
Jul 23 Python
python3字符串操作总结
Jul 24 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
基于Tensorflow一维卷积用法详解
May 22 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 Python
Python返回真假值(True or False)小技巧
Apr 10 #Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 #Python
Python字符串中查找子串小技巧
Apr 10 #Python
简单介绍Ruby中的CGI编程
Apr 10 #Python
详细介绍Ruby中的正则表达式
Apr 10 #Python
对于Python的Django框架部署的一些建议
Apr 09 #Python
Python线程中对join方法的运用的教程
Apr 09 #Python
You might like
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
Javascript之String对象详解
2016/06/08 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
Javascript的this详解
2019/03/23 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
深入理解Python中字典的键的使用
2015/08/19 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
商场消防演习方案
2014/02/12 职场文书
公司总经理岗位职责
2014/03/15 职场文书
化工专业自荐书
2014/06/16 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
高三语文复习计划
2015/01/19 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
Python绘制分类图的方法
2021/04/20 Python