目录
前篇讲了如果使用pycharm创建django项目并输出helloWorld,本篇开始讲如何连接数据库,这里主要是以mysql8.0为主。
主要知识:
入教程的《第 2 节:模型和管理站点》
专题指南 中的《序列化 Django 对象》:主要是把python数据类型转为可网络传输的json格式
一、环境说明
我使用的是win7 64位
软件名 | 版本 | 说明 |
---|---|---|
8.1 | 用它安装mysql8.0,可以看安装教程 | |
13.0 | mysql连接工具,可以连接mysql教程 | |
3.8.9 | django所依赖的环境,是基于python的web框架 | |
2021.1 | django ide开发工具 | |
mysqlclient | 2.0.3 | django中mysql客户端模块,在pycharm中添加 |
phpStudy如果安装mysql8.0和启动,在说明后面已经给出连接,不懂的可以去看一下。
这个项目也是在前篇所建立helloWold项目的基础上进行的。
二、django安装mysql驱动及配置
2.1 配置mysql数据库
django默认数据库为SQLite,我们需要把它修改为mysql,所以需要修改一下配置。
打开mydjango/settings.py,找到
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
修改为
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
'TIME_ZON': 'Asia/Shanghai'
}
}
PS:我这里使用的是root,因为phpStudy中mysql默认登录用户名和密码都是root ,如果使用其它可以修改一下。
注:mysql8.0之前的版本,密码加密方式是:mysql_native_password, mysql8和php7.2.4之后默认密码加密方式是caching_sha2_password
在phpStudy中把root修改为mysql_native_password 加密方式了。
2.2 添加mysql驱动
2.2.1 驱动说明
django默认没有安装mysql驱动,所以要安装一下。官方原文如下:
如果你正在使用 MySQL 或 MariaDB,则需要一个像 mysqlclient 一样的 DB API 驱动。 详细信息参见 MySQL 后端注意事项。
MySQL 数据库 API 驱动程序
MySQL 有几个驱动程序实现了 PEP 249 中描述的 Python 数据库 API。
- mysqlclient 是一个原生驱动。它是 推荐的选择。
- MySQL Connector/Python 是一个来自 Oracle 的纯 Python 驱动,不需要 MySQL 客户端库或标准库之外的任何 Python 模块。
这些驱动程序都是线程安全的,并提供连接池
我这里选择官方推荐的mysqlclient安装
2.2.2 安装mysqlclient
我这里直接使用pycharm安装mysqlclient了,操作如下:
如果安装成功会提示安装成功,如下图所示:
再关闭此窗口发现多了一个mysqlclient,如下图所示:
三、使用命令生成相关mysql表
3.1 创建模型model
我打算创建如下形式的学生表,如下所示:
这些表是django用相对命令生成的,在生成表之前,需要创建一个model模型,model配置models.py代码如下:
from django.db import models
# Create your models here.
class Stu(models.Model):
sid = models.CharField(max_length=15, verbose_name='学号')
name = models.CharField(max_length=20, verbose_name='名字')
yuWen = models.DecimalField(max_digits=3, decimal_places=1, verbose_name='语文')
shuXue = models.DecimalField(max_digits=3, decimal_places=1, verbose_name='数学')
PS:这里我没有设置主键,django会自动添加生成一个名为id的字段,并自增
3.2 使用makemigrations命令生成迁移文件
在生成迁移文件,可以使用makemigrations命令,这样它会把之前的变化所做的修改涉及数据库的,会保存到迁移模块app/migrations中。
这个很简单只要执行一下命令即可。
在pycharm最下方,选择终端terminal,执行
# 也可以python manage.py makemigrations app
python manage.py makemigrations
这样生成一个app/migrations/0001_initial.py文件
3.3 使用migrate迁移命令生成相关的表
3.3.1 创建django数据库
使用migrate迁移命令只会生成对应的表,不会创建数据库,所以要先创建一个数据库。
在这里按上面settings中的mysql配置,得知数据库为django,所以我创建一个django空数据库
PS:你也可以尝试不创建数据库,直接执行看一下报错提示。
3.3.2 使用migrate命令生成相关的表
在pycharm最下方,选择终端terminal,执行如下命令:
python manage.py migrate
从上图中看到,会创建一堆表,主要是看settings中的 NSTALLED_APPS 配置,我的如下:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app.apps.AppConfig', ]
看一下mysql是否生成相关的表,如图所示:
PS:其中app_stu 就是我在app模块定义的Stu类,表的格式为
<model所以的应用名>_<model.py中的类名>
所以我的为app_Stu,这个表是空的,没数据的
四、测试效果
4.1 为stu表填写数据
为了方便测试,我要在上面的app_Stu表中添加一些数据。
使用Webyog SQLyog连接上mysql,并输入如下sql命令并执行
INSERT INTO app_stu (`id`,`sid`,`name`,`yuWen`,`shuXue`) VALUES
(1,'001','张三',51.0,65.0),
(2,'002','李四',71.0,80.0),
(3,'003','王五',87.6,90.0),
(4,'004','陈六',55.9,88.0),
(5,'005','谢九',77.0,59.0),
(6,'006','天天',45.0,90.0),
(7,'007','开心',70.0,100.0),
(8,'008','乐儿',65.0,50.0),
(9,'009','乐乐',88.0,29.5),
(10,'010','笑笑',73.0,69.0),
(11,'011','fly',90.0,89.0),
(12,'012','乐天',90.0,70.0),
(13,'013','云儿',95.0,65.0),
(14,'014','伊洛',14.0,70.0),
(15,'015','abc',86.0,98.0),
(16,'016','菲菲',90.0,99.0),
(17,'017','mm',71.0,61.0),
(18,'018','lilei',98.0,61.0),
(19,'019','hua',90.0,99.5);
执行SELECT * FROM app_stu; 命令,结果如下:
4.2 做一个简单的查询
4.2.1 django的查询知识
在这里我做一个简单的基于学号查学生成绩的代码。如何查询 ,在专题指南 中的《执行查询》做了如下说明:
检索对象
要从数据库检索对象,要通过模型类的
Manager
构建一个QuerySet
。一个
QuerySet
代表来自数据库中对象的一个集合。它可以有 0 个,1 个或者多个 filters. Filters,可以根据给定参数缩小查询结果量。在 SQL 的层面上,QuerySet
对应SELECT
语句,而*filters*对应类似WHERE
或LIMIT
的限制子句。你能通过模型的
Manager
获取QuerySet
。每个模型至少有一个Manager
,默认名称是objects
。像这样直接通过模型类使用它:
注:Managers
只能通过模型类访问,而不是通过模型实例,目的是强制分离 “表级” 操作和 “行级” 操作。
所以我们可以直接使用.objects操作,返回一个
QuerySet
4.2.2 序列化转成json格式
上面的查询得到的是查询集QuerySet,是pythoin的object类型,因为前后端分离,我们还得要显示为方便网络传输的json格式。
要使用到json需要用到django的序列化相关内容,可以看专题指南 中的《序列化 Django 对象》。
结合种一个例子
serializers.serialize('xml', Restaurant.objects.all())
它使用的是xml,我们把把修改为json就行了,这样就变成了
serializers.serialize('json', <查询集>)
4.2.3 视图中添加查询代码
从上面的思路得到了代码,打开app/views.py,添加如下代码
def stuBySid(request, stuSid):
res=Stu.objects.filter(sid=stuSid)
return HttpResponse(serializers.serialize("json", res))
4.2.4 配置url路由
打开app/urls.py,在urlpatterns添加如下代码:
path('sid/<str:StuSid>', views.stuBySid, name='stuBysid')
总代码如下:
from django.urls import path
from app import views
urlpatterns = [
path('', views.index, name="index"),
path('sid/<str:stuSid>', views.stuBySid, name='stuBysid')
]
上面<str:StuSid>的意思是<>表示正则表达式,携带参数,str表示字符串,StuSid对应函数的参数名,一定要对应上,要不报错。
4.3 效果
运行django,输入 http://127.0.0.1:8000/sid/001 查看一下效果:
PS:001的意思是学号,这个是在没有前端的条件下手工输入的。
PSS:我们学过点开发基础的都知道,正常写是http://127.0.0.1:8000/sid?stuSid=001
而把?号变斜杠,把变量名省去,变成sid/<变量值>,这样方式叫url的pathinfo模式