Maison  >  Article  >  développement back-end  >  L'art de gérer des requêtes complexes avec Python ORM

L'art de gérer des requêtes complexes avec Python ORM

王林
王林avant
2024-03-18 09:19:021201parcourir

Python ORM 处理复杂查询的艺术

python Mappage relationnel d'objets (ORM) Framework mappe de manière transparente les données des bases de données relationnelles aux objets Python, simplifiant ainsi l'interaction avec les bases de données. Même les requêtes les plus complexes peuvent être exécutées facilement et efficacement avec un ORM.

1. Requête imbriquée :

Les requêtes imbriquées permettent d'utiliser les résultats d'une requête comme entrée dans une autre requête. Dans un ORM, cela peut être réalisé en utilisant des filtres imbriqués. Par exemple, vous pouvez utiliser la méthode filter() pour imbriquer une sous-requête afin de rechercher des enregistrements correspondant à des critères spécifiques.

Exemple :

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. Requête de participation :

Les requêtes de jointure combinent les enregistrements de plusieurs tables. Dans l'ORM, cela peut être fait en joignant deux tables en utilisant la méthode join() 方法来实现。例如,可以通过使用 join() pour trouver des livres avec un auteur spécifique.

Exemple :

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. Fonction d'agrégation :

Les fonctions d'agrégation combinent plusieurs valeurs en une seule valeur, comme la somme, la moyenne ou la recherche de la valeur maximale. Dans un ORM, cela peut être fait en utilisant une fonction telle que sum()avg()max() 等聚合函数来实现。例如,可以使用 sum() pour compter le nombre total de livres d'un auteur spécifique.

Exemple :

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. Requête dynamique :

Les requêtes dynamiques permettent de construire des requêtes au moment de l'exécution. Dans l'ORM, cela peut être fait en utilisant la fonction dynamic() 函数来实现。例如,可以使用 dynamic() pour créer une requête contenant des critères de filtre spécifiques.

Exemple :

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")
))

En utilisant efficacement ces fonctionnalités d'ORM, les développeurs peuvent créer des requêtes complexes et efficaces sans écrire directement des instructions SQL. Cela simplifie l’interaction avec la base de données et améliore la lisibilité et la maintenabilité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer