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!