前言
数据库是 web 应用中很重要的组成部分之一。Django 框架自带了 sqlite3 数据库,然而在使用的广泛程度上,MySQL 的应用场景更加多。本篇主要解释如何将数据库换成 MySQL,以及一些基本用法。
更换默认数据库为 MySQL
创建数据库
由于 django 的 orm 只能完成对于表的操作,因此数据库的创建需要我们自行完成,这里以本地 MySQL 数据库为例。在 MySQL 终端输入
完成数据库的创建。然后运行 use {db_name}
,若提示为 empty set(空的数据库),则创建成功。
安装第三方依赖
首先我们需要安装第三方包 pymysql
(你也可以使用mysqlclient
),这个第三方包能够帮助 Django 完成对 MySQL 数据库的增删改查操作,
如果安装缓慢,可以参考本系列的第一篇文章,将安装源换成国内镜像站。
更改项目配置文件
在项目目录下找到setting.py
,找到DATABASES
,这里默认是
1 | DATABASES = { |
其中, ENGINE
指明了数据库类型, NAME
指明了数据库名称。默认情况下,Django 使用内部集成的 sqlite3.我们修改之,
1 | DATABASES = { |
其中,HOST
是主机 ip,这里使用的是本地,因此是127.0.0.1
,PORT
是端口号,本地 MySQL 的端口号是3306
。然后,你需要在项目的_init_.py
中添加:
1 | import pymysql |
使用 Django 操作 MySQL 的表
创建表
表的操作都可以用 python 语法完成,其中 orm 会将其翻译成 SQL 语句,对于我们来说,无需自己再写 SQL 语句了。
在已注册的应用下的models.py
中新建类,例如我们要创建一个用户信息的表,那么我们可以写成
1 | from django.db import models |
然后,我们在终端运行
这时,Django 自动为我们创建了表,其相当于
1 | create table app01_userinfo( |
在 MySQL 终端输入
终端输出
1 | mysql> show tables; |
这表明,app01_userinfo
的表已经被创建。当然,这里其他的表示 Django 内部的其他类,我们这里无需在意。接下来我们检查字段。MySQL 终端输入
观察到输出
1 | mysql> desc app01_userinfo; |
其中,name
,password
和age
都是我们所定义的字段,id
是 Django 自动创建的字段。
修改表
当然,我们也免不了修改表的字段数,例如,我们不需要age
这一个字段了,我们只需要在models.py
下删除之。
1 | from django.db import models |
然后重新在终端执行makemigrations
和migrate
二连,我们就可以观察到这一字段消失了。
有时候,我们也会为表中新增字段,例如:
1 | from django.db import models |
执行数据迁移二连,我们会发现控制台有警报。
这是因为,当我们添加字段时,如果表中有数据,那么这些数据的新字段的值我们就不得而知。因此,会产生上述的告警。控制台给了我们两种解决方式:
- 为已有的数据分配初始值来填补这些空缺;
- 在
models.py
中声明初始值。
对于选择 1,我们可以将已有的数据的该字段的值赋值成为我们指定的值,这里不多说了。对于选择 2,则需要为该字段指定默认值,那么上述语句可以被重写成
1 | class UserInfo(models.Model): |
于是,控制台告警消失,并且之前所有已存在的数据的新字段都被赋值为初始值。当然了,你也可以声明该字段允许为空,例如:
1 | class UserInfo(models.Model): |
这样也是可以的。
使用 Django 操作 MySQL 中的数据
我们依然可以用 python 语句来操作 MySQL 中的数据。
创建数据
创建数据的语法是:
1 | {类名}.objects.create(参数列表) |
例如我们需要在app01_userinfo
中插入一段记录,以下就是一个例子:
1 | UserInfo.objects.create(name="Felix", password="123", age=19) |
这句 python 会被 orm 翻译成 SQL 语句:
1 | insert into app01_userinfo(name, password, age)value("Felix", "123", 19) |
删除数据
删除数据的语法是:
1 | {类名}.objects.filter(筛选条件).delete() |
如果你要清空数据,那么可以写成
1 | {类名}.objects.all().delete() |
当然,过滤函数还有许多写法,这里只展示了filter()
和all()
。
查找数据
查找数据的语法是
1 | {类名}.objects.filter(筛选条件) |
函数的返回值是一个QuerySet
类型,在 python 中,其可以被理解成结构体对象的列表,例如
[<UserInfo: UserInfo object (1)>, <UserInfo: UserInfo object (2)>, <UserInfo: UserInfo object (3)>]
如果我们要读取其内部值,就可以用简单的 python 语法实现,这里举个例子:
1 | user_info_list = UserInfo.objects.all() |
当然,如果我们明确知道表中只有一行数据,那么我们可以避免使用循环,直接用
1 | obj = UserInfo.objects.all().first() |
获取对象即可。
更新数据
更新数据,首先要找到需要更新的记录,因此,前一部分与查找是很相似的。update()
函数完成后续的更新操作,例如:
1 | UserInfo.objects.filter(id=2).update(password = "999") |
则被筛选出的记录的password
字段都会被更新成999
。
后记
有了与数据库的联动操作,我们已经可以写一些基础的业务逻辑了。当然,Django 对于数据库的操作远不止这些。
本文链接:https://my.lmcjl.com/post/15955.html
4 评论