文章目录
36、部署准备(二):MySQL
1、什么是MySQL
MySQL是一款跨平台的开源的关系型数据库
2、为什么使用MySQL
- | MySQL | SQLite |
---|---|---|
特点 | 为服务器端而设计 | 轻量级、可嵌入 |
高并发访问 | 能 | 不能 |
占用内存 | 比SQLite大 | 小 |
适用性 | 服务器 | 适合桌面应用和手机应用 |
3、如何使用MySQL
- 1、安装MySQL
- 1)下载MySQL
- 2)路径加入系统环境
- 3)配置MySQL
- 4)启动服务
- 5)设置root密码
alter user 'root'@'localhost' identified by 'test123456';
- 2、创建数据库(注意字符编码)
- 3、创建表(应用数据库迁移文件)
- 4、若有缓存表,也需创建
1、安装MySQL
1)下载MySQL
2)路径加入系统环境
加入系统环境是为了方便我们从任何位置进入到数据库,即在任何位置都能直接使用mysql
这个命令。
路径加入系统环境:复制路径C:\Program Files\MySQL\MySQL Server 8.0\bin,右击“计算机”——点开“属性”——点开“高级系统设置”——“环境变量”——“系统环境变量” Path——写一个分号,再把我们复制的路径粘贴进来——点击“确定”“确定”“确定”
3)配置MySQL
下载完成之后,我们还要做一个步骤:配置MySQL。
配置MySQL的话,需要新建一个配置文件,my.ini,填写内容如下:
my.ini:
[mysqld]
# 设置mysql的安装目录
basedir="C:/Program Files/MySQL/MySQL Server 8.0"
# 设置没有啥情况数据库的数据的存放目录
datadir="C:/Program Files/MySQL/MySQL Server 8.0/data"
# 设置默认使用的端口
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_password
default_authentication_plugin=caching_sha2_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
4)启动服务
配置完成之后,我们还需要对MySQL做初始化操作,需要用到bin/mysqld
进入bin目录下的cmd(注意,这里要以管理员身份打开cmd),输入mysqld --initialize-insecure --user=mysql --console
,-insecure --user=mysql --console
是创建用户,用一种不用密码的方式,方便我们进行操作处理
初始化完毕以后,我们就可以进入到数据库里面,进入之前我们还需要安装启动下mysql这个服务
安装:mysqld --install
启动:net start mysql
5)设置root密码
启动成功之后,我们就可以进入数据库,输入mysql -u root -p
,-u 指定用户(这里用的是root用户),回车后需要输入密码,这里刚刚我们是没有设置密码,是空密码,我们不输入 直接回车就可以进入了。
既然是空密码,我们就需要改一下密码,输入alter user 'root'@'localhost' identified by 'test123456';
,给root用户改密码为test123456。改完之后,输入exit
退出,然后重新进入数据库mysql -u root -p
,回车,然后输入密码test123456
接下来我们要配置一下django,让django可以使用访问MySQL数据库。需要设置mysite/settings.py如下:
2、创建数据库(注意字符编码)
(要加上utf8或utf8mb4编码)
这里,我们需要先在mysql下创建一个数据库mysite_db,输入create database mysite_db default charset=utf8mb4 default collate utf8mb4_unicode_ci;
创建,可以输入show databases;
查看
另外,如果在settings.py中设置用户名和密码为root和test123456,会有一个安全性的问题,root是权限最大的用户,意味着mysql数据库里面所有的数据库它都能看到,一旦别人知道用户名和密码的时候,就能够获取其他数据库、更改数据库数据、甚至删掉数据库。所以我们最好是给这个项目创建一个专门的用户。
在mysql下输入命令create user 'zzzf'@'localhost' identified by 'abc123456';
创建用户和密码,然后输入grant all privileges on mysite_db.* to 'zzzf'@'localhost';
给这个数据库设置权限,数据库权限给到zzzf这个用户,输入命令flush privileges;
刷新权限。这样,zzzf这个用户就拥有这个数据库的全部权限了。
我们可以输入exit
退出来,然后用zzzf这个用户登录mysql -u zzzf -p
,输入密码,然后show databases;
查看数据库,就可以看到有了mysite_db这个数据库
然后对应的修改settings.py如下:
3、创建表(应用数据库迁移文件)
接下来我们就要看能否正常使用。
进入mysite虚拟环境,迁移数据库,这里会提示“是否安装了mysqlclient库”,这是python访问mysql的一个库,我们输入pip install mysqlclient
安装一下就可以。
这里如果提示安装不了,那么我们可以用whl这个包,可以访问mysqlclient(https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient),找到python对应版本的mysqlclient进行下载,这里我的python版本是3.7,64位,所以下载对应的whl,下载好之后放到mysite目录下,然后在cmd下输入pip install mysqlclient-1.4.6-cp37-cp37m-win-amd64.whl
,安装成功之后输入pip list
看到mysqlclient客户端这个库可已经安装完毕了。
4、若有缓存表,也需创建
接着继续之前的应用迁移数据库,输入python manage.py migrate
,再打开本地服务python manage.py runserver
,在浏览器访问localhost:8000,可以看到有一个错误提示,缓存表不存在。这里我们只需要执行一条命令就可以,输入python manage.py createcachetable
,然后再启动本地服务,访问页面
创建缓存表时出错:
试着将创建数据库字符集修改为utf8:
然后再重新创建缓存表,迁移应用启动数据库:
可以看到数据库里面是没有数据的,这时候我们就需要把数据从SQLite数据库迁移到MySQL数据库了。
4、迁移数据
- SQLite ——> MySQL
- 使用Django导出导入数据的命令完成迁移
python manage.py dumpdata > data.json
python manage.py loaddata data.json
我们先把settings.py里面DATABASES配置改回之前的SQLite。然后我们用上面说的命令来迁移数据
输入命令python manage.py dumpdata > data.json
接着我们把settings.py里面DATABASES配置改成MySQL的,
输入命令python manage.py loaddata data.json
这时会提示有个错误,“在ContentType表里面重复输入了一些数据,导致数据导入不进去”。
我们打开mysql数据库,
输入use mysite_db;
使用mysite_db这个数据库,
输入show tables;
查看这个数据库有哪些表,可以看到有django_content_type这个表,
输入select * from django_content_type;
查看一下这个表里面有什么数据。
刚刚提示错误里面就是现实pk=7这条数据重复了,那我们就可以把这个表的全部数据给删掉,
输入delete * from django_content_type;
,这时提示错误,这个表跟另外一个表auth_permission有外键关联,那么我们把这个表的数据也给删了,
输入delete * from auth_permission;
,成功后再输入delete from django_content_type;
,删除完毕。
删除完毕之后,我们重新回到虚拟环境,输入python manage.py loaddata data.json
重新载入数据。
然后开启服务,刷新页面,可以看到博客的数据都有了。接着我们就可以用之前我们开发所用到的用户名和密码登录
5、时区问题
- 日期归档文章的数量显示不正确
- 原因:MySQL没有加载时区相关的表
这里我们可以发现一个问题,右侧栏的日期归档统计都归零了,这跟MySQL没有启动时区有关系,查看django官方文档(https://docs.djangoproject.com/en/2.0/ref/databases/)
在下载的这个文件目录下, 进入cmd,输入mysql -u root -p mysql < timezone_posix.sql
,完成之后我们刷新博客页面,可以看到 日期归档那一栏数量出来了,不再是0了,点进去也能进行正常的筛选
至此,MySQL相关的操作已经完成了。