阅前先赞,养好习惯!
之前讲过MySQL连接pymysql,PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,用于直接与 MySQL 数据库交互。通过 PyMySQL,可以发送原生 SQL 查询语句,并获取查询结果。但是大家也能看到,PyMySQL的一些语句其实和MySQL是差不多的,并且代码比较繁琐,切换数据库也很麻烦,要修改大量代码。
现在来介绍另一种方法:ORM
Django 的 ORM(Object-Relational Mapping)是一种将数据库表和 Python 类关联起来的工具,允许开发者通过操作 Python 对象来与数据库交互,而不需要直接编写 SQL 查询。
两者区别:
特性 | Django ORM | PyMySQL |
|---|---|---|
开发效率 | 高:无需手写 SQL,直接用 Python 操作数据库。 | 低:需要手写 SQL,代码量多,容易出错。 |
代码可读性 | 高:简洁、结构化,贴近业务逻辑。 | 中:需要理解 SQL 和 Python 代码的混合逻辑。 |
数据库独立性 | 强:支持多种数据库(MySQL、PostgreSQL、SQLite 等),切换数据库只需更改配置,无需改动代码。 | 弱:依赖 MySQL,切换数据库需要修改大量 SQL。 |
学习成本 | 低:只需学习 Django 的模型和查询 API。 | 高:需要熟悉 SQL 语法和数据库操作。 |
性能 | 中:抽象层带来开销,复杂查询可能性能较低。 | 高:直接发送 SQL,性能更高。 |
功能扩展 | 高:内置丰富功能,如分页、外键、查询优化等。 | 低:需要自己实现复杂功能。 |
错误处理 | 自动处理,减少手动处理的错误风险。 | 完全依赖开发者,错误处理工作量大。 |
raw SQL 查询。 ORM是一个框架,可以通过PyMySQL工具来操作MySQL,而在Django开发中,一般使用mysqlclient工具而并非PySQL,有两个原因,一个是Django 官方文档中明确推荐使用 mysqlclient,因为它和 Django 的 ORM 紧密集成,兼容性经过了长期验证;还有就是mysqlclient的性能要好一点。
Orm将数据库基本语句弄得更简单,将简单的语句翻译成数据库原生代码。
打开控制台输入:
pip install mysqlclient安装成功界面:

由于mysqlclient无法创建数据库,所以得我们自己创建,详细教程前文有说:
进入到mysql>下,输入:
create database mydata default character set utf8;并检查mydata是否已被创建
show databases;
打开settings文件,这里是默认的连接sqlite3,这也是一种数据库,我们要改成MySQL的,先把这段代码注释。

输入:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #django连接mysql,还可以连oracle、sqlite3、postgresql等等
'NAME': 'mydata', #数据库名字
'USER':'root', #用户
'PASSWORD':'612612', #密码
'HOST':'127.0.0.1', #主机
'PORT':'3306', #端口
}
}注意!大家的数据库名称和密码可能与我不一样,修改一下即可

在app的models文件中,每新建一个类,就是创建一张表,类需继承models类
class Department(models.Model):
title = models.CharField(max_length=32)例如上面的Department类就是创建了一张表,表中有title行,32位字符型
class UserInfo(models.Model): #继承models类
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()UserInfo类定义了一个长度为32的字符串行name,长度为64的字符串行password,有符号情况下最多十位的整型age行。
类名代替表名,字段名代表列名上面的UserInfo类其实就相当于MySQL中的:
create table app01_userinfo(
id bigint auto_increment primary key,
name varchar(32),
password varchar(64),
age int,
)运行命令如下:
python manage.py makemigrations
python manage.py migrate在Pycharm终端依次输入运行即可
注意前提是下载了mysqlclient库,并且app已注册

检查表是否创建成功:
desc app01_userinfo;注意!!!虽然我们在models中创建的是UserInfo类,但mysqlclient处理后真正的表名是
应用名+_+类(类全小写)
所以此处表名是 app01_userinfo

创建表后还能再添加字段吗?当然是可以的
在类中再添加一个字段,输入:
size = models.IntegerField()运行后提示:

1、要是选择1的话,点击Enter,会提示让您输入一个默认值,然后那一列都将是那个默认值。
2、要是选2的话,并且没有任何操作,数据库中将不会显示新加的数据。
3、选2后,在源代码中添加默认值,将会出现数据。
size = models.IntegerField(default=2)也可以将数据设置成空:
size = models.IntegerField(null=True,blank=True)删除表很简单,只需要将类注释或者直接删掉,再输入这两行命令刷新即可
python manage.py makemigrations
python manage.py migrate新建一个url,用来测试是否添加数据
def orm(requests):
# 测试orm操作表中的数据
return HttpResponse("成功")增加数据命令:
UserInfo.objects.create(name="谭谈",password="1234",age=18)启动项目,发现数据确实是添加进去了

大家可以自己再多添加几行数据,便于后面的修改与删除

删除满足特定条件的数据:
Department.objects.filter(id=2).delete()确实是删除了

删除全部数据:
这就不演示了,大家可以自己玩玩
UserInfo.objects.all().delete()UserInfo.objects.filter(id=1).update(name="有的兄弟")确实是修改了

使用.all()方法获取数据
data_list = UserInfo.objects.all()
print(data_list)可以先在控制台打印看看

发现拿到的是一个QuerySet对象,包含三个数据,每个数据后面的数字代表ID值
可以通过迭代器和点属性来获取具体的值:
for data in data_list:
print(data.id,data.name,data.password,id.age)发现确实是被正确获取并打印了:

获取到的QuerySet可以通过索引和其他方法取值,常见的有以下三种,我就不一一介绍了,大家可以自己玩玩:
.first() vs .get() vs [0]
方法 | 返回值 | 异常处理 | 使用场景 |
|---|---|---|---|
.first() | 第一条记录或 None | 不抛出异常 | 不确定是否有数据时更安全 |
.get() | 符合条件的唯一对象 | 抛出 DoesNotExist 异常 | 确定条件只会返回一条数据时使用 |
[0] | 第一条记录或抛出 IndexError | 抛出 IndexError 异常 | 确定有数据且只需第一条时使用 |
本次分享就到这儿了
下一篇博客更新用户管理综合案例!!!
感谢您的三连!!!