1. 什么是ORM?
ORM( Object Relational Mapping ),即对象关系映射,ORM框架在面向对象编程语言和关系数据库之间充当了一个桥梁的作用,它把关系型数据库的表结构映射到了对象实体上,这样我们可以通过操作对象来操作数据库。
ORM的作用:
ORM可以把我们从SQL语句的编写中解放出来,例如增删改查、SQL表间关系的操作、数据类型的转换操作等等,通过ORM框架使用Python的面向对象编程语言来实现数据库操作。
2. Django的ORM模块
Django的ORM模块是Django框架中提供的一种操作数据库的方式,它抹平了程序员对于不同关系型数据库的差异性,提供了一种统一的数据访问API,完全基于面向对象思想,让使用者能够以自然的方式对SQL进行操作,而不需要过于关注SQL的具体细节。
2.1 配置ORM
在配置ORM之前,首先需要安装数据库引擎,例如MySQL或SQLite等。Django默认使用的是SQLite数据库。
在settings.py中使用DATABASES配置数据库的连接信息:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
ENGINE:表示数据库引擎,比如MySQL、SQLite、Oracle等。
NAME:表示数据库名,例如上面的‘db.sqlite3’。
2.2 创建ORM模型
Django的ORM模型是通过Python面向对象的方式操作数据库,其每一个模型类代表着数据库中的一张数据表。如果想要操作某个数据表,我们就需要定义一个与之对应的模型类。
以User表为例,来定义一个User模型类:
from django.db import models
class User(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
class User(models.Model):定义了一个继承自models.Model的User模型类,其中Model是Django框架中提供的一个基类,主要作用是将模型类转换成数据表,它封装了常用的数据库操作,如增删改查等。
2.3 同步ORM模型与数据库
在创建好模型后,我们需要将其同步到数据库中,这样Django才知道对应的数据结构。ORM模块提供了一个简单的命令可以实现同步操作,即makemigrations和migrate。
在终端中执行以下操作:
# 生成迁移文件(记录了对数据库的更改)
python manage.py makemigrations
# 执行迁移文件,将模型同步到数据库中
python manage.py migrate
3. Django ORM的常见操作
3.1 数据的增删改查
ORM的常见操作包括增删改查,Django ORM也提供了这些操作。
3.1.1 查询
Django ORM中提供了filter和get方法来进行查询操作,其中filter返回满足条件的一个QuerySet对象,而get返回单个结果对象。
以查询年龄大于18岁的用户为例:
users = User.objects.filter(age__gt=18)
其中filter方法中age__gt=18表示年龄大于18。
查询年龄等于18岁并且名字为‘Tom’的用户:
user = User.objects.get(age=18, name='Tom')
其中get方法要求结果唯一,如果查询出多个结果,会抛出MultipleObjectsReturned异常;如果没有查询到结果,则会抛出DoesNotExist异常。
3.1.2 插入
插入一条记录,需要创建一个模型实例,并调用save()方法:
user = User(name='Lucy', age=20)
user.save()
3.1.3 修改
修改指的是在数据库中对指定记录的某些字段进行修改,首先需要获取到需要修改的记录:
user = User.objects.get(id=1)
然后修改对应的字段,并调用save()方法即可完成修改:
user.age = 22
user.save()
3.1.4 删除
删除指的是在数据库中删除指定记录,Django ORM提供了delete()方法来进行删除操作。以删除年龄大于18岁的用户为例:
users = User.objects.filter(age__gt=18)
users.delete()
3.2 多表操作
在数据库中,一个模型类对应的表不一定满足我们的需求,可能会涉及到多表的联合查询等操作。Django ORM对此提供了简便的实现方式,即ForeignKey外键和ManyToManyField字段。
3.2.1 ForeignKey外键
ForeignKey外键用于在多张表中建立联系,例如一个Course表和一个Teacher表,一个教师可以教授多门课程,而一门课程只能由一个教师授课。那么这时一个课程就可以有一个外键teacher,对应着教师表中的主键id。
Course模型类可能会长这样:
class Course(models.Model):
name = models.CharField(max_length=100)
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
这样,我们通过Course模型类就能够访问到教师表中的信息。
3.2.2 ManyToManyField字段
ManyToManyField字段用于多对多的关系,例如一个学生可以报名多个课程,而一个课程也可以被多个学生报名。当出现这样的情况时,我们可以在学生表和课程表中都添加一个ManyToManyField字段,例如Student.course和Course.student,表示学生和课程之间的关系。
Course模型类可能会长这样:
class Course(models.Model):
name = models.CharField(max_length=100)
students = models.ManyToManyField(Student)
这样,我们通过Course模型类就能够访问到所有报名这门课程的学生信息。
3.3 查询优化
Django ORM提供了一些查询优化的手段以提高性能。
3.3.1 select_related
select_related方法用于在查询时将指定的关联数据也先查询出来,这样不会在后面的操作中多次查询数据库,从而提高了查询效率。
例如查询所有选了某门课程的学生:
students = Student.objects.filter(course__name='Python').select_related('course')
其中select_related('course')表示将course表的信息一并查询出来。
3.3.2 prefetch_related
prefetch_related方法用于在查询时一次性将关联的所有数据查询出来,并将其缓存起来,同时还可以进行一些设置,如限制查询的数量等。
例如查询所有学生选的所有课程:
students = Student.objects.prefetch_related('course_set')
其中prefetch_related('course_set')表示将和当前查询集有关系的course_set数据预先给取出来。
3.3.3 使用索引
在进行大数据量的操作时,正确地使用索引是提高性能的关键。在Django ORM中,可以在模型类中进行配置:
class User(models.Model):
name = models.CharField(max_length=20, db_index=True)
age = models.IntegerField()
在这里我们将name这一字段配置为索引,这样在进行查询时就会更加高效。
4. 总结
本文主要介绍了ORM的概念、Django ORM的使用以及常见的增删改查、多表操作和查询优化等内容。ORM将关系型数据库的表结构映射到了对象实体上,让我们更加方便和自然地操作数据库。Django ORM模块简化了数据库的操作,提供了一种统一的数据访问API,使我们能够以自然的方式对SQL进行操作。