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

Seni mengendalikan pertanyaan kompleks dengan Python ORM

王林
Lepaskan: 2024-03-18 09:19:02
ke hadapan
1238 orang telah melayarinya

. 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")
))
Salin selepas log masuk
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")
Salin selepas log masuk

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)
Salin selepas log masuk

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")
))
Salin selepas log masuk

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!

Label berkaitan:
sumber:lsjlt.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan