python 對(duì)象關(guān)系映射 (ORM) 框架可將關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)無(wú)縫映射到 Python 對(duì)象,從而簡(jiǎn)化與數(shù)據(jù)庫(kù)的交互。即使是最復(fù)雜的查詢,也能通過(guò) ORM 輕松有效地執(zhí)行。
1. 嵌套查詢:
嵌套查詢?cè)试S將一個(gè)查詢的結(jié)果作為另一個(gè)查詢的輸入。在 ORM 中,這可以通過(guò)使用嵌套過(guò)濾器來(lái)實(shí)現(xiàn)。例如,可以使用 filter()
方法嵌套一個(gè)子查詢,以查找與特定條件匹配的記錄。
示例:
from sqlalchemy import and_, Column from sqlalchemy.orm import sessionmaker, relationship # 創(chuàng)建一個(gè) 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" 的書籍標(biāo)題 query = session.query(Book.title).filter(Book.author_id.in_( session.query(Author.id).filter(Author.name == "John") ))
登錄后復(fù)制
2. 聯(lián)接查詢:
聯(lián)接查詢將多個(gè)表中的記錄組合在一起。在 ORM 中,這可以通過(guò)使用 join()
方法來(lái)實(shí)現(xiàn)。例如,可以通過(guò)使用 join()
方法連接兩個(gè)表,以查找具有特定作者的書籍。
示例:
from sqlalchemy import and_, Column from sqlalchemy.orm import sessionmaker, relationship # 創(chuàng)建一個(gè) 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) # 使用聯(lián)接查詢查找所有作者姓名為 "John" 的書籍標(biāo)題 query = session.query(Book.title).join(Book.author).filter(Author.name == "John")
登錄后復(fù)制
3. 聚合函數(shù):
聚合函數(shù)可將多個(gè)值組合成單個(gè)值,例如求和、求平均值或查找最大值。在 ORM 中,這可以通過(guò)使用諸如 sum()
、avg()
和 max()
等聚合函數(shù)來(lái)實(shí)現(xiàn)。例如,可以使用 sum()
函數(shù)來(lái)計(jì)算特定作者的書籍總數(shù)。
示例:
from sqlalchemy import and_, Column from sqlalchemy.orm import sessionmaker, relationship # 創(chuàng)建一個(gè) 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) # 使用聚合函數(shù)計(jì)算特定作者的書籍總數(shù) query = session.query(Author.name).group_by(Author).having(func.count(Book.id) > 1)
登錄后復(fù)制
4. 動(dòng)態(tài)查詢:
動(dòng)態(tài)查詢?cè)试S在運(yùn)行時(shí)構(gòu)建查詢。在 ORM 中,這可以通過(guò)使用 dynamic()
函數(shù)來(lái)實(shí)現(xiàn)。例如,可以使用 dynamic()
函數(shù)來(lái)構(gòu)建一個(gè)包含特定過(guò)濾條件的查詢。
示例:
from sqlalchemy import and_, Column, literal from sqlalchemy.orm import sessionmaker, relationship # 創(chuàng)建一個(gè) 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) # 使用動(dòng)態(tài)查詢構(gòu)建一個(gè)包含特定過(guò)濾條件的查詢 query = session.query(Book).filter(literal(True).in_( session.query(1).filter(Book.title == "Book Title") ))
登錄后復(fù)制
通過(guò)有效利用 ORM 的這些特性,開發(fā)人員可以構(gòu)建復(fù)雜的高效查詢,而無(wú)需直接編寫 SQL 語(yǔ)句。這簡(jiǎn)化了數(shù)據(jù)庫(kù)交互,提高了可讀性和可維護(hù)性。