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和缓存等手段优化查询性能。

原创文章,作者:GOST,如若转载,请注明出处:https://www.506064.com/n/148888.html

相关推荐

  • JS Proxy(array)用法介绍

    JS Proxy(array)可以说是ES6中非常重要的一个特性,它可以代理一个数组,监听数据变化并进行拦截、处理。在实际开发中,使用Proxy(array)可以方便地实现数据的监…

    编程 2025-04-29
  • at least one option must be selected

    问题解答:当我们需要用户在一系列选项中选择至少一项时,我们需要对用户进行限制,即“at least one option must be selected”(至少选择一项)。 一、…

    编程 2025-04-29
  • Python官网中文版:解决你的编程问题

    Python是一种高级编程语言,它可以用于Web开发、科学计算、人工智能等领域。Python官网中文版提供了全面的资源和教程,可以帮助你入门学习和进一步提高编程技能。 一、Pyth…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • 银行资金管理系统总结

    银行资金管理系统是银行日常业务运营的核心支撑系统,主要负责处理银行的资金流动、结算、清算等业务。本文将从功能特点、技术架构、安全性以及未来发展趋势等多个方面对银行资金管理系统进行详…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • 如何修改mysql的端口号

    本文将介绍如何修改mysql的端口号,方便开发者根据实际需求配置对应端口号。 一、为什么需要修改mysql端口号 默认情况下,mysql使用的端口号是3306。在某些情况下,我们需…

    编程 2025-04-29
  • 英语年龄用连字符号(Hyphenation for English Age)

    英语年龄通常使用连字符号表示,比如 “five-year-old boy”。本文将从多个方面探讨英语年龄的连字符使用问题。 一、英语年龄的表达方式 英语中表…

    编程 2025-04-29
  • Idea新建文件夹没有java class的解决方法

    如果你在Idea中新建了一个文件夹,却没有Java Class,应该如何解决呢?下面从多个方面来进行解答。 一、检查Idea设置 首先,我们应该检查Idea的设置是否正确。打开Id…

    编程 2025-04-29
  • 金额选择性序列化

    本文将从多个方面对金额选择性序列化进行详细阐述,包括其定义、使用场景、实现方法等。 一、定义 金额选择性序列化指根据传入的金额值,选择是否进行序列化,以达到减少数据传输的目的。在实…

    编程 2025-04-29