Django如何把SQLite数据库转换为Mysql数据库


大部分新手刚学Django开发的时候默认用的都是SQLite数据库,上线部署的时候,大多用的却是Mysql。那么我们应该如何把数据库从SQLite迁移转换成Mysql呢?

首先我们先安装Mysql,如果已经安装了,请直接查看:把SQLite数据导入到MySQL中

一、下载Mysql8.0

点击 Download MySQL Community Server页面下载Mysql8.0,大家看我的截图标示。我下载的是最新版本8.0的。

d0a190243843fe743446052a1fc5bba.png

二、安装Mysql

在C盘建立一个mysql文件夹,然后把下载下载的压缩包解压到mysql目录里去。里面会多出一个mysql-8.0.12-winx64目录,打开它,如下图片所示:

4c34df8aef59bdeadec3c01d441bf45.png

三、配置Mysql

我们在C盘创建一个目录mysqldata,用来放我们的Mysql数据,这个目录建议不要放到Mysql安装目录,以免哪天误删,单独放到另一个目录,方便以后备份(仅是个人习惯)。然后打开目录:C:\mysql\mysql-8.0.12-winx64,在这个目录里新建一个叫my.ini的文件,然后在里面输入如下内容:

[mysqld] # 设置mysql的安装目录,也就是刚才我们安装的目录basedir=C:/mysql/mysql-8.0.12-winx64
# 设置mysql数据库的数据的存放目录,刚才创建的mysqldata目录datadir=C:/mysqldata
# 设置默认使用的端口port=3306# 允许最大连接数max_connections=200
# 允许连接失败的次数。这是为了防止有人试图攻击数据库max_connect_errors=10
# 服务端使用的字符集character-set-server=utf8mb4
# 数据库字符集对应一些排序等规则使用的字符集collation-server=utf8mb4_general_ci
# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件作为认证加密方式
# MySQL8.0默认认证加密方式为caching_sha2_passworddefault_authentication_plugin=mysql_native_password 
[mysql]# 设置mysql客户端默认字符集default-character-set=utf8mb4 
[client]default-character-set=utf8mb4port=3306

提示:

1、复制目录路径的时候,要把里面的"\"修改成“/”.

2、默认加密方式default_authentication_plugin设置为mysql_native_password,新版本和老版本加密方式不一样,这样设置主要是为了兼容老版本。

四、把Mysql添加到环境变量,方便使用。

添加环境变量的目的主要是方便使用,我们可以直接在CDM命令行里输入Mysql命令。

步骤:

打开Mysql的目录下的bin目录,也就是C:\mysql\mysql-8.0.12-winx64\bin,复制它。然后返回桌面,单击"我的电脑"--右键“属性”--点击“高级系统设置”--找到“环境变量”:

6fb7418696d53fdd5b05d1795cf9dc9.png

点击“环境变量”,在打开出来的新窗口里的系统变量里找到"Path",双击它:

5cbf5a81a9fdc4ba7396d7e177c15b4.png

五、初始化Mysql,并设置密码。

在文件夹的地址栏里输入“CMD”,或者使用快捷键“win+R”,输入cmd再回车,即可打开cmd。在里面输入如下命令进行Mysql初始化:

mysqld --initialize-insecure --user=mysql --console

执行初始化命令成功之后,再执行下面的命令,安装mysql服务:

mysqld --install

安装服务成功之后,输入下面命令启动服务:

net start mysql

这样,mysql服务就启动了。然后我们给Mysql设置一个密码:

mysql -u root -p

-u root 是指定root用户登录,-p 是要求输入密码。刚刚初始化创建的密码为空,要求输入密码的时候,直接回车即可。成功登录进去,即可看到如下界面:

321a979d1ec6f7b9b2674d05106613c.png

输入如下SQL语句,修改root用户的密码:

alter user 'root'@'localhost' identified by '想要设置的密码';

如果想新建立一个用户和数据库,然后给这个用户和数据啼设置单独的管理权限和密码,可依次输入下面的命令:

CREATE DATABASE 你的数据库名 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;#创建新的数据啼 
django 为你的数据库名 并设置数据库编码CREATE USER '你的用户名'@'localhost' IDENTIFIED BY '你的密码';
#创建新的用户GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'localhost';
#把刚刚创建的数据库的管理权限给予刚刚创建的MySQL用户FLUSH PRIVILEGES;#刷新权限,使用设置生效

如何在Django中使用Mysql,和配置settings,我这里就不多说,不明白的可以查看下面的链接。

Django中如何使用Mysql数据库
Django全局配置settings.py详解

六、把SQLite数据导入到MySQL中

之前我们默认使用的是SQLite数据库,我们开发完成之后,里面有许多数据。如果我们想转换成Mysql数据库,那我们先得把旧数据从SQLite导出,然后再导入到新的Mysql数据库里去。

1、SQLite导出数据

导出之前,我们先确保settins.py数据库配置选项那里,还是使用的是SQLite配置,如果已经修改了,请先修改回来:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

然后在CMD命令行里输入:

python manage.py dumpdata > data.json

这样就将数据导出到Django项目根目录下的data.json文件。

2、MySQL导入数据
同样,先将Django的数据库配置改为MySQL的:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '你的数据库名',
        'USER': '你的MySQL用户名',
        'PASSWORD': '你的密码',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

然后在CMD命令行里输入:

python manage.py loaddata data.json

注意:

确保Mysql用户表里为空的,如果之前有迁移过数据到Mysql,有可能会出错。注意出错的时候所报的错误信息。如果提示有重复主键,那需要先删掉数据。这些数据是在给MySQL数据库应用迁移文件的时候产生的,一般是content_type相关的表。

进入到MySQL,执行如下的SQL语句:

use 你的数据库名;delete from auth_permission;delete from django_content_type;

删除数据之后,再执行一次导入命令即可。基本上,导入不了数据都是MySQL存在数据导致的。

七、加载时区表

另外,有可能所安装的MySQL没有加载时区表。这个可能会导致filter对日期的查询有问题。Django官方文档也指出这个问题。MySQL官网也有对应处理方法:加载时区表。

Linux/Mac解决方法都很简单。windows系统要先下载一个sql文件:timezone_2018e_posix_sql.zip。

下载完成之后,解压得到一个sql文件,再执行cmd命令导入该文件即可:

mysql -u root -p mysql < timezone_posix.sql

八、MySQL数据到PostgreSQL

操作很简单:

 ./manage.py dumpdata >> backup.json

到PostgreSQL对应的配置中:

    ./manage.py loaddata backup.json