将Django使用的数据库从MySQL迁移到PostgreSQL的教程
第一步,在你的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
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就可以了。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
上一篇: python 实现md5加密
下一篇: zend debug,求教 ,解决办法
推荐阅读
-
将ABP的数据库从SQLSERVER迁移到MySql
-
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
-
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
-
Django应用数据库从MySQL到PostgreSql的迁移
-
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
-
mysql-使用gitlab-ce包安装的gitlab怎么把数据库从PostgreSQL换成Mysql
-
Linux下将数据库从MySQL迁移到MariaDB的基础操作教程_MySQL
-
mysql-使用gitlab-ce包安装的gitlab怎么把数据库从PostgreSQL换成Mysql
-
Linux下将数据库从MySQL迁移到MariaDB的基础操作教程_MySQL
-
将ABP的数据库从SQLSERVER迁移到MySql
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论