Heim > Artikel > Backend-Entwicklung > Python ORM 处理复杂查询的艺术
python Object Relational Mapping (ORM) Framework ordnet Daten in relationalen Datenbanken nahtlos Python-Objekten zu und vereinfacht so die Interaktion mit Datenbanken. Selbst die komplexesten Abfragen können mit einem ORM einfach und effizient ausgeführt werden.
1. Verschachtelte Abfrage:
Verschachtelte Abfragen ermöglichen die Verwendung der Ergebnisse einer Abfrage als Eingabe für eine andere Abfrage. In einem ORM kann dies durch die Verwendung verschachtelter Filter erreicht werden. Sie können beispielsweise die Methode filter()
verwenden, um eine Unterabfrage zu verschachteln, um Datensätze zu finden, die bestimmten Kriterien entsprechen.
Beispiel:
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. Beitrittsanfrage:
Join-Abfragen kombinieren Datensätze aus mehreren Tabellen. Im ORM kann dies durch die Verknüpfung zweier Tabellen mit der join()
方法来实现。例如,可以通过使用 join()
-Methode erreicht werden, um Bücher mit einem bestimmten Autor zu finden.
Beispiel:
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. Aggregationsfunktion:
Aggregationsfunktionen kombinieren mehrere Werte zu einem einzigen Wert, z. B. Summieren, Mitteln oder Ermitteln des Maximalwerts. In einem ORM kann dies durch die Verwendung einer Funktion wie sum()
、avg()
和 max()
等聚合函数来实现。例如,可以使用 sum()
erfolgen, um die Gesamtzahl der Bücher eines bestimmten Autors zu zählen.
Beispiel:
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. Dynamische Abfrage:
Dynamische Abfragen ermöglichen die Erstellung von Abfragen zur Laufzeit. Im ORM kann dies erreicht werden, indem die Funktion dynamic()
函数来实现。例如,可以使用 dynamic()
verwendet wird, um eine Abfrage mit bestimmten Filterkriterien zu erstellen.
Beispiel:
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") ))
Durch die effektive Nutzung dieser ORM-Funktionen können Entwicklerkomplexe und effiziente Abfragen erstellen, ohne SQL-Anweisungen direkt schreiben zu müssen. Dies vereinfacht die Datenbankinteraktion und verbessert die Lesbarkeit und Wartbarkeit.
Das obige ist der detaillierte Inhalt vonPython ORM 处理复杂查询的艺术. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!