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/zh-hk/n/148888.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GOST的頭像GOST
上一篇 2024-11-04 17:49
下一篇 2024-11-04 17:49

相關推薦

  • 面向對象編程、類和對象

    面向對象編程(Object-Oriented Programming, OOP)是一種編程方法,它將現實世界中的事物抽象為對象(Object),對象的屬性和方法被封裝成類(Clas…

    編程 2025-04-29
  • 依賴關係代碼的用法介紹

    依賴關係代碼在軟件開發中扮演着至關重要的角色。它們指定了項目中各個模塊之間的依賴關係。本文將從多個方面對依賴關係代碼進行詳細的闡述。 一、依賴關係代碼的作用 依賴關係代碼可以幫助開…

    編程 2025-04-28
  • Mapster:一個高性能的對象映射庫

    本文將深入介紹furion.extras.objectmapper.mapster,一個高性能的對象映射庫,解釋它是如何工作的以及如何在你的項目中使用它。 一、輕鬆地實現對象之間的…

    編程 2025-04-28
  • ORM持久層

    ORM(對象關係映射)是一種編程技術,它將面向對象的編程語言中的對象與關係型數據庫中的表進行映射。通過ORM,我們可以用面向對象的方式操作數據庫,減少了手寫SQL語句的複雜度以及對…

    編程 2025-04-28
  • Python返回對象類型

    Python是一種動態、解釋型、高級編程語言。Python是一種面向對象的語言,即所有的一切都是一個對象。 一、基本類型 Python中的基本類型有整數int、浮點數float、布…

    編程 2025-04-28
  • Python中通過對象不能調用類方法和靜態方法的解析

    當我們在使用Python編寫程序時,可能會遇到通過對象調用類方法和靜態方法失敗的問題,那麼這是為什麼呢?接下來,我們將從多個方面對這個問題進行詳細解析。 一、類方法和靜態方法的定義…

    編程 2025-04-27
  • Java持久層框架的複合主鍵實現

    用Java持久層框架來操作數據庫時,複合主鍵是常見的需求。這篇文章將詳細闡述javax.persistence複合主鍵的實現方式,並提供完整的示例代碼。 一、複合主鍵的定義 複合主…

    編程 2025-04-27
  • Python內置函數——查看對象內存

    本文將介紹Python內置函數中,在開發中查看對象內存的相關函數。 一、id()函數 id()函數是Python內置函數,用於返回對象的唯一標識符,也就是對象在內存中的地址。 nu…

    編程 2025-04-27
  • Python實現天氣關係圖

    本文將介紹如何使用Python繪製天氣關係圖,通過分析和可視化天氣數據,幫助我們更好地了解天氣的變化和趨勢。 一、數據準備 首先我們需要從數據源中獲取天氣數據。我們可以使用爬蟲技術…

    編程 2025-04-27
  • Python和數學的關係

    Python是一門開源、高級、通用的編程語言,廣泛應用於科學計算、人工智能、數據分析等領域。而數學則是Python的一個重要應用領域。Python的簡潔、靈活的語法和龐大的數學庫,…

    編程 2025-04-27

發表回復

登錄後才能評論