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

我们已对 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就可以了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2294444.html

(0)
上一篇 2025年2月28日 02:39:50
下一篇 2025年2月28日 02:40:19

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何写一个 web 程序和服务器端的一个 exe 程序进行通信?

    (1)服务器端的一个exe程序向web程序发送数据,web程序要知被通知的时候再将结果呈现在浏览器上的web页面上。(2)从浏览器web页面上按下按钮后,要让服务器端的一个exe知道,有些东西变了ps. web小程序和服务器端的一个exe程…

    编程技术 2025年4月1日
    100
  • LNMP与MySQL优化:如何提高数据库性能

    提升LNMP(Linux, Nginx, MySQL, PHP)架构下MySQL数据库性能的关键策略: 一、硬件升级 内存扩容: MySQL对内存需求量大,增加服务器内存可显著提升性能。SSD升级: 使用固态硬盘(SSD)替代传统机械硬盘(…

    2025年4月1日
    100
  • Linux LAMP如何实现远程访问

    本文将指导您如何在Linux系统上配置LAMP环境并实现远程访问。 以下步骤将确保您的Web服务器安全且可访问。 第一步:安装和配置Apache Web服务器 首先,确保您的Linux系统已安装Apache。使用您的发行版包管理器安装:例如…

    2025年4月1日
    100
  • Linux LAMP中MySQL如何调优

    Linux LAMP架构中,MySQL数据库的性能优化至关重要,直接关系到整个Web应用的效率和稳定性。本文将介绍关键的优化步骤和建议。 一、硬件资源优化 CPU: 选择64位处理器,高主频和高缓存容量能够有效提升并发处理能力。内存: 充足…

    2025年4月1日
    100
  • LNMP服务器搭建:需要哪些硬件资源

    构建高效稳定的LNMP服务器(Linux, Nginx, MySQL/MariaDB, PHP),需要合适的硬件资源作为支撑。以下建议基于行业最佳实践和经验总结: 处理器 (CPU): 建议: 采用多核心服务器级CPU,例如Intel Xe…

    2025年4月1日
    100
  • LNMP环境配置:你需要知道哪些步骤

    LNMP架构是构建高效Web服务器的理想选择,它结合了Linux操作系统、Nginx网页服务器、MySQL/MariaDB数据库和PHP编程语言。以下步骤将指导您完成LNMP环境的搭建: 一、准备工作: 确保您的Linux系统已更新至最新版…

    2025年4月1日
    100
  • LNMP如何更新换代

    LNMP (Linux, Nginx, MySQL, PHP) 技术栈是构建动态网站和应用的常用选择。 本文将指导您如何安全高效地更新您的LNMP环境。 第一步:数据备份与配置文件保存 在开始任何更新操作前,务必备份所有关键数据和配置文件。…

    2025年4月1日
    100
  • LNMP安全设置:怎样做才更安全

    LNMP架构(Linux、Nginx、MySQL、PHP)是构建Web应用的常用技术栈,其安全性至关重要。本文提供一系列安全建议,助您提升LNMP系统的安全性: 及时更新软件: 定期更新Nginx、MySQL、PHP及操作系统至最新版本,修…

    2025年4月1日
    100
  • LNMP备份策略:如何确保数据安全

    LNMP(Linux, Nginx, MySQL, PHP)架构的网站数据安全至关重要。本文提供一套有效的LNMP备份策略,助您有效保护宝贵数据。 核心策略: 定时备份计划: 制定全量备份和增量备份计划,频率根据数据重要性和变化频率而定。全…

    2025年4月1日
    200
  • 如何利用Linux LAMP搭建博客系统

    本文将指导您如何在Ubuntu Linux系统上搭建一个基于LAMP(Linux, Apache, MySQL, PHP)架构的博客系统,以WordPress为例。 一、系统准备:安装Ubuntu操作系统 首先,在您的服务器上安装Ubunt…

    2025年4月1日
    100

发表回复

登录后才能评论