Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Seni mengendalikan pertanyaan kompleks dengan Python ORM

Seni mengendalikan pertanyaan kompleks dengan Python ORM

王林
王林ke hadapan
2024-03-18 09:19:021219semak imbas

. Malah pertanyaan yang paling kompleks boleh dilaksanakan dengan mudah dan cekap dengan ORM.

Python ORM 处理复杂查询的艺术

1. Pertanyaan bersarang:

Pertanyaan bersarang membenarkan hasil satu pertanyaan digunakan sebagai input kepada pertanyaan lain. Dalam ORM, ini boleh dicapai dengan menggunakan penapis bersarang. Contohnya, anda boleh menggunakan kaedah untuk menyusun subkueri untuk mencari rekod yang sepadan dengan kriteria tertentu. Contoh:

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. Sertai pertanyaan:

Sertai pertanyaan menggabungkan rekod daripada berbilang jadual. Dalam ORM, ini boleh dilakukan dengan menggabungkan dua jadual menggunakan kaedah

untuk mencari buku dengan pengarang tertentu.

Contoh:

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).join(Book.author).filter(Author.name == "John")

3. Fungsi pengagregatan:

Fungsi pengagregatan menggabungkan berbilang nilai ke dalam satu nilai, seperti menjumlahkan, purata atau mencari nilai maksimum. Dalam ORM, ini boleh dilakukan dengan menggunakan fungsi seperti

untuk mengira jumlah bilangan buku oleh pengarang tertentu.

Contoh:

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)

# 使用聚合函数计算特定作者的书籍总数
query = session.query(Author.name).group_by(Author).having(func.count(Book.id) > 1)

4. Pertanyaan dinamik:

Pertanyaan dinamik membenarkan pertanyaan dibina pada masa jalan. Dalam ORM, ini boleh dilakukan dengan menggunakan fungsi

untuk membina pertanyaan yang mengandungi kriteria penapis tertentu.

Contoh:

sum()avg()max() 等聚合函数来实现。例如,可以使用 sum()

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

Dengan menggunakan ciri ORM ini secara berkesan,

pembangunboleh membina pertanyaan yang kompleks dan cekap tanpa menulis pernyataan SQL secara langsung. Ini memudahkan interaksi pangkalan data dan meningkatkan kebolehbacaan dan kebolehselenggaraan.

Atas ialah kandungan terperinci Seni mengendalikan pertanyaan kompleks dengan Python ORM. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:lsjlt.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam