您的位置:

Python实现ORM对象关系映射,方便数据持久化操作

一、ORM简介

ORM(Object-Relational Mapping)即对象关系映射,是一种使得程序员可以使用面向对象的方式来操作关系型数据库的技术。ORM将数据库表映射成类,将表中的字段映射成类的属性,将表中的记录映射成类的实例,从而将数据库的操作转化成面向对象的操作。ORM的目的是让程序员更加直观地操作数据库,以及避免SQL语句拼接的麻烦。

二、Python中的ORM库

Python中有很多优秀的ORM库,比如Django中自带的ORM,SQLAlchemy等。这些ORM库大多数都提供了良好的API以及一套固定的操作规范,能够方便地进行数据库的操作。本文以Django自带的ORM举例。

三、Django ORM基础使用

Django ORM的使用非常简单,只需要定义好Model,并且进行数据库迁移,就可以直接使用ORM进行操作数据库。

# 示例代码
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

# 数据库迁移
python manage.py makemigrations
python manage.py migrate

# CRUD操作
p = Person.objects.create(name='Tom', age=18)
p = Person.objects.get(id=1)
p.age = 19
p.save()
Person.objects.filter(name='Bob').delete()

上述代码中,定义了一个Person Model,包含了name和age两个字段。然后进行了数据库的迁移,生成了对应的数据表。之后就可以使用ORM进行CRUD操作,比如创建、获取、更新、删除操作。

四、Django ORM高级用法

Django ORM不仅提供了基础的CRUD操作,还提供了很多高级的用法,比如聚合操作、条件查询、链式查询等等。下面举例说明:

1、聚合操作

Django ORM提供了很多方便的聚合操作,比如求和、平均值、最大值、最小值等等。

# 示例代码
from django.db.models import Sum, Avg, Max, Min
Person.objects.all().aggregate(Sum('age'))
Person.objects.all().aggregate(Avg('age'))
Person.objects.all().aggregate(Max('age'))
Person.objects.all().aggregate(Min('age'))

2、条件查询

Django ORM提供了丰富的条件查询方式,能够灵活地进行筛选操作。

# 示例代码
Person.objects.filter(age__gte=18)
Person.objects.filter(name__startswith='T')
Person.objects.filter(age__in=[18, 19])
Person.objects.filter(name__contains='o').exclude(age=18)

3、链式查询

Django ORM支持链式查询,即可以对查询结果进行进一步筛选。

# 示例代码
Person.objects.filter(age__gte=18).filter(name__contains='o')
Person.objects.filter(Q(age__gte=18) | Q(name__contains='o'))
Person.objects.filter(age__gte=18).exclude(name__contains='o')

五、Django ORM性能调优

ORM操作不慢(可能也不快),但是在大型项目中,性能调优仍然非常重要。下面举例说明,如何对Django ORM进行性能调优。

1、使用select_related、prefetch_related减少查询次数

在ORM中,如果需要使用到关联表的信息,会触发查询。这样会增加查询次数,降低查询性能。使用select_related、prefetch_related可以减少查询次数,提高性能。

# 示例代码
# select_related使用方法
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

books = Book.objects.select_related('author').all()

# prefetch_related使用方法
class Tag(models.Model):
    name = models.CharField(max_length=100)
    books = models.ManyToManyField(Book)

tags = Tag.objects.prefetch_related('books').all()

2、使用缓存减少查询次数

缓存是性能调优的重要手段之一,Django ORM支持使用缓存,可以将查询结果缓存起来,避免重复查询。

# 示例代码
from django.core.cache import cache
books = cache.get('all_books')
if not books:
    books = Book.objects.all()
    cache.set('all_books', books, 60 * 60 * 24)

六、总结

本文介绍了ORM的基本原理,以及Django ORM的使用方法。Django ORM提供了良好的API以及丰富的查询方式,可以方便地进行数据库操作。在大型项目中,性能调优仍然非常重要,需要使用select_related、prefetch_related和缓存等手段优化查询性能。