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中文網其他相關文章!