Django2.x连接MySQL8.x方法与各种错误解析

1.安装mysqlclient
在第一步时,如果你用老办法pip install mysqlclient安装的话,很大几率会出现error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools的错误

错误提示缺少组件Microsoft Visual C++ 14.0,但此时你不必四处寻找VC14.0,只需要在python库下载需要的mysqlclient的WHL库文件,并再次使用pip install安装即可

python库下载地址: 
很乱的一个,需要Ctrl+F寻找需要内容,需选择下载版本 
Python官方提供

下载完成后,使用管理员模式进入控制台,进入下载文件所在目录,然后使用pip install WHL文件名安装mysqlclient库

如下:

PS C:\WINDOWS\system32> cd C:\Users\我的用户名\Downloads
PS C:\Users\我的用户名\Downloads> pip install mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl

Processing c:\users\lanouhn\downloads\mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl
Installing collected packages: mysqlclient
Successfully installed mysqlclient-1.3.13

PS C:\WINDOWS\system32> cd C:\Users\我的用户名\Downloads
PS C:\Users\我的用户名\Downloads> pip install mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl

Processing c:\users\lanouhn\downloads\mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl
Installing collected packages: mysqlclient
Successfully installed mysqlclient-1.3.13


2.配置settings.py文件
此步骤是在你已经将工程和需要的app创建完成后执行的,如果未创建请先使用指令创建工程和app

django-admin startproject project_name # 创建工程
python manage.py startapp app_name # 创建app

django-admin startproject project_name # 创建工程
python manage.py startapp app_name # 创建app


创建完成后,在工程文件夹生成的子文件中,找到settings.py文件,修改其中内容

首先在INSTALLED_APPS中将创建的app名称追加在其后,使工程可以识别到所创建app 
如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 之后是自己追加的内容
    'app1'
]

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 之后是自己追加的内容
    'app1'
]


然后修改DATABASES中内容,Django默认数据库为sqlite3数据库,使用MySQL数据库需要重新配置其中内容 
如下:

# 原内容
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# 修改为
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  #数据库驱动名
        'NAME': 'my_test', #数据库名称
        'USER': 'root',  # 用户名
        'PASSWORD': '123', #密码
        'HOST': '127.0.0.1', #IP地址
        'PORT': '3306',  # 端口号

# 原内容
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# 修改为
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  #数据库驱动名
        'NAME': 'my_test', #数据库名称
        'USER': 'root',  # 用户名
        'PASSWORD': '123', #密码
        'HOST': '127.0.0.1', #IP地址
        'PORT': '3306',  # 端口号


这里没有坑,可以安心进行下一步

3.修改models.py文件
在所创建的app中,models.py文件代表数据库各表的结构,Django可以根据models.py中的结构自动生成数据表,所以需要先修改models.py中文件,再执行数据迁移 
如下:

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=16)

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=16)


语法类型可以自行百度,这里不再赘述

4.数据迁移
到这里,恭喜您,迎来了这步骤中最大的坑!<( ̄ ﹌  ̄)>

我不知道我是不是个例,网上所有的教程对这一步骤都是一概而过,放上两个指令就一切ok了,但偏偏我的错误错的让我怀疑人生。

首先是标准教程的两条指令

python manage.py makemigrations # 生成迁移
python manage.py migrate # 执行迁移

python manage.py makemigrations # 生成迁移
python manage.py migrate # 执行迁移


其中生成迁移命令执行时,Django会将所有models.py中数据结构按照所规定的数据库类型编译 
接着使用执行迁移命令,Django将生成的内容插入到MySQL对应的表中

以上是基本操作,接下来便是各种坑了

(1)更改MySQL8.x加密方式
如果使用的是Django2.x以及MySQL8.x,那么很大几率会出现执行数据迁移指令后,被一大串的以File开头错误刷屏的情况

而在一大堆File…错误中,仔细寻找(痛不欲生)会发现_mysql_exceptions.OperationalError: (2059, <NULL>) 
和django.db.utils.OperationalError: (2059, <NULL>) 
两条关键错误,而所有的教程没有一个有解决方案的

此错误原因是MySQL8.x采用了新的加密方式,但Django2.x并不识别此种加密,导致无法连接到数据库,让人十分无奈

找到错误原因就使用百度找答案呗,查找修改MySQL8.x加密方式,出现一大堆解决方案,全是清一色的

# 选择mysql库
USE mysql;
# 修改加密方式
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新数据库
FLUSH PRIVILEGES;

# 选择mysql库
USE mysql;
# 修改加密方式
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新数据库
FLUSH PRIVILEGES;


我一脸兴奋的去修改加密方式,仿佛成功就在眼前,然后MySQL给了我一记重拳,错误又一次出现,不过这次是MySQL的 
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'

继续查找错误ERROR 1396 (HY000)解决方案,可笑的是所有的博客都让我使用新的加密方式和改密方法,(╯°Д°)╯︵┻━┻我要是可以用新的加密方法还改什么密码!!!

最后在发现将'root'@'localhost'改为'root'@'%'才是真正的写法

# 选择mysql库
USE mysql;
# 修改加密方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新数据库
FLUSH PRIVILEGES;

# 选择mysql库
USE mysql;
# 修改加密方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新数据库
FLUSH PRIVILEGES;


看到Query OK, 0 rows affected (0.30 sec)简直想哭 
记得刷新数据库

(2)需要手动创建数据库
在完成最困难的第一步,我以为我终于可以使用指令进行数据迁移时,Django又给了我一次重击

在同样一大堆File…错误刷屏中,再次提取出错误关键信息,索性此次信息内容还挺简明 
_mysql_exceptions.OperationalError: (1049, "Unknown database 'my_test'")

未知的数据库’my_test’,所以在MySQL中,先手动创建一个以你在setting.py中设置的’NAME’属性所照应名字的数据库,然后再执行数据迁移

之后大功告成(๑╹◡╹)ノ”“” happy!
 

猜你喜欢

转载自blog.csdn.net/Thoms_/article/details/83510166