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中文网其它相关文章!