首頁  >  文章  >  後端開發  >  Python ORM 處理複雜查詢的藝術

Python ORM 處理複雜查詢的藝術

王林
王林轉載
2024-03-18 09:19:021219瀏覽

Python ORM 处理复杂查询的艺术

python 物件關係映射(ORM) 框架可將關係資料庫中的資料無縫地映射到Python 對象,從而簡化與資料庫的交互。即使是最複雜的查詢,也能透過 ORM 輕鬆有效地執行。

1. 巢狀查詢:

巢狀查詢允許將一個查詢的結果作為另一個查詢的輸入。在 ORM 中,這可以透過使用嵌套過濾器來實現。例如,可以使用 filter() 方法巢狀一個子查詢,以尋找與特定條件相符的記錄。

範例:

from sqlalchemy import and_, Column
from sqlalchemy.orm import sessionmaker, relationship

# 建立一個 ORM Session
Session = sessionmaker()
session = Session()

# Book 表和 Author 表
class Book(Base):
id = Column(Integer, primary_key=True)
title = Column(String)
author_id = Column(Integer, ForeignKey("authors.id"))

# Author 表
class Author(Base):
id = Column(Integer, primary_key=True)
name = Column(String)

# 使用巢狀查詢尋找所有作者姓名為 "John" 的書籍標題
query = session.query(Book.title).filter(Book.author_id.in_(
session.query(Author.id).filter(Author.name == "John")
))

2. 聯結查詢:

聯接查詢將多個表中的記錄組合在一起。在 ORM 中,這可以透過使用 join() 方法來實現。例如,可以透過使用 join() 方法連接兩個表,以尋找具有特定作者的書籍。

範例:

from sqlalchemy import and_, Column
from sqlalchemy.orm import sessionmaker, relationship

# 建立一個 ORM Session
Session = sessionmaker()
session = Session()

# Book 表和 Author 表
class Book(Base):
id = Column(Integer, primary_key=True)
title = Column(String)
author_id = Column(Integer, ForeignKey("authors.id"))

# Author 表
class Author(Base):
id = Column(Integer, primary_key=True)
name = Column(String)

# 使用聯結查詢尋找所有作者姓名為 "John" 的書名
query = session.query(Book.title).join(Book.author).filter(Author.name == "John")

3. 聚合函數:

聚合函數可將多個值組合成單一值,例如求和、求平均值或找出最大值。在 ORM 中,這可以透過使用諸如 sum()avg()max() 等聚合函數來實現。例如,可以使用 sum() 函數來計算特定作者的書籍總數。

範例:

from sqlalchemy import and_, Column
from sqlalchemy.orm import sessionmaker, relationship

# 建立一個 ORM Session
Session = sessionmaker()
session = Session()

# Book 表和 Author 表
class Book(Base):
id = Column(Integer, primary_key=True)
title = Column(String)
author_id = Column(Integer, ForeignKey("authors.id"))

# Author 表
class Author(Base):
id = Column(Integer, primary_key=True)
name = Column(String)

# 使用聚合函數計算特定作者的書籍總數
query = session.query(Author.name).group_by(Author).having(func.count(Book.id) > 1)

4. 動態查詢:

動態查詢允許在執行時間建立查詢。在 ORM 中,這可以透過使用 dynamic() 函數來實現。例如,可以使用 dynamic() 函數來建立一個包含特定過濾條件的查詢。

範例:

from sqlalchemy import and_, Column, literal
from sqlalchemy.orm import sessionmaker, relationship

# 建立一個 ORM Session
Session = sessionmaker()
session = Session()

# Book 表和 Author 表
class Book(Base):
id = Column(Integer, primary_key=True)
title = Column(String)
author_id = Column(Integer, ForeignKey("authors.id"))

# Author 表
class Author(Base):
id = Column(Integer, primary_key=True)
name = Column(String)

# 使用動態查詢建立一個包含特定篩選條件的查詢
query = session.query(Book).filter(literal(True).in_(
session.query(1).filter(Book.title == "Book Title")
))

透過有效利用 ORM 的這些特性,開發人員可以建立複雜的高效查詢,而無需直接編寫 SQL 語句。這簡化了資料庫交互,提高了可讀性和可維護性。

以上是Python ORM 處理複雜查詢的藝術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:lsjlt.com。如有侵權,請聯絡admin@php.cn刪除