query parametrlar, Query, where, ilike, or_, order_by, limit, offset, sahifalash
10-sinfAdvanced Python Back-end5-hafta · 15-darsQuery va where
ilike, or_, order_by
limit, offset, total
Qisman yangilash uchun qaysi metod ishlatiladi?
PATCH faqat yuborilgan maydonlarni o'zgartiradi.Query va where
@router.get("/", response_model=list[BookRead])
async def list_books(
author: str | None = None,
min_pages: int | None = Query(None, ge=1),
published_year: int | None = None,
db: AsyncSession = Depends(get_db),
):
stmt = select(Book).where(Book.is_published.is_(True))
if author:
stmt = stmt.where(Book.author == author)
if min_pages:
stmt = stmt.where(Book.pages >= min_pages)
if published_year:
stmt = stmt.where(Book.published_year == published_year)
return (await db.scalars(stmt)).all()
GET /books?min_pages=100&published_year=2020 ikkala shartni birga (AND) qo'llaydi. min_pages=0 bo'lsa if min_pages: shart o'tmaydi: aniq tekshiruv uchun is not None ishlating.Ketma-ket yozilgan ikkita where(...) qanday birikadi?
AND bilan birlashtiradi.ilike, or_, order_by
from sqlalchemy import or_
ALLOWED_SORT = {"title": Book.title, "created_at": Book.created_at, "pages": Book.pages}
def apply_search(stmt, q: str | None):
if q:
like = f"%{q}%"
stmt = stmt.where(or_(Book.title.ilike(like), Book.author.ilike(like)))
return stmt
def apply_sort(stmt, sort: str):
desc = sort.startswith("-")
column = ALLOWED_SORT.get(sort.lstrip("-"))
if column is None:
raise HTTPException(400, "Noto'g'ri sort maydoni")
return stmt.order_by(column.desc() if desc else column.asc())
% va _ belgilari LIKE da maxsus. Katta jadvalda boshida % bo'lgan ilike indeksdan foydalanmaydi (keyingi bosqich: pg_trgm).sort=-pages nimani bildiradi?
- kamayish tartibini bildiradi.limit, offset, total
class BookPage(BaseModel):
items: list[BookRead]
total: int
limit: int
offset: int
@router.get("/", response_model=BookPage)
async def list_books(q: str | None = None, sort: str = "-created_at",
limit: int = Query(10, ge=1, le=100),
offset: int = Query(0, ge=0),
db: AsyncSession = Depends(get_db)):
stmt = apply_search(select(Book).where(Book.is_published.is_(True)), q)
total = await db.scalar(select(func.count()).select_from(stmt.subquery()))
stmt = apply_sort(stmt, sort).limit(limit).offset(offset)
items = (await db.scalars(stmt)).all()
return BookPage(items=items, total=total, limit=limit, offset=offset)
limit ga yuqori chegara (masalan, 100) qo'yish shart: aks holda limit=1000000 bilan serverni yuklash mumkin. GET /books?q=python&sort=title&limit=5&offset=10.limit=10, offset=20 qaysi yozuvlarni qaytaradi?
ilike, bir nechta maydon, or_Aniq shartlar uchun filtr, matn uchun qidiruv.
URL dagi ?kalit=qiymat qismi
Katta-kichik harfni farqlamaydigan qidiruv
Sahifa hajmi va o'tkazib yuboriladigan yozuvlar
Filtrga mos jami yozuvlar soni
where bilan shartlarni qo'shing.
ilike, or_, ruxsat etilgan sort.
count, limit, offset va BookPage.
| URL | Ma'nosi |
|---|---|
| ?author=Navoiy | muallif bo'yicha filtr |
| ?q=python | sarlavha yoki muallifda qidiruv |
| ?sort=-pages | sahifalar bo'yicha kamayish |
| ?limit=5&offset=10 | 3-sahifa, 5 tadan |
| ?min_pages=100 | kamida 100 bet |
Pastga bosing: Swagger da sinash
GET /books da q va sort ni to'ldiring.limit=2&offset=2 bilan sahifalashni tekshiring.
stmt = select(Book)
stmt = select(Book).order_by(Book.created_at.desc())
Standart qiymatlar va chegara serverni himoya qiladi.
published_year bo'yicha filtrni list_books ga qo'shing.q parametri sarlavha va muallifda registrni farqlamay qidirsin.sort (ruxsat etilgan maydonlar) va limit/offset ni yozing, total qaytaring.where + Query; AND bilan birikadi.
ilike, or_, order_by va ruxsat etilgan maydonlar.
limit, offset, total.
Uyga vazifa: filtr, qidiruv, tartib va pagination bilan GET /books.
UploadFile, media, yuklash va yuklab olish
6-hafta · 16-dars