Asosiy qismga o'tish

database.py — bazaga ulanish

3-bob 5 kod bloki 359 so'z

Kichik fayl, lekin bitta muhim tushuncha bor: connection pool.

Kod

python24 qator
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base

from app.config import settings

engine = create_engine(
    settings.database_url,
    pool_size=5,
    max_overflow=10,
    pool_pre_ping=True,
    echo=False,
)

SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)

Base = declarative_base()


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

Nega pool kerak

Bazaga ulanish qimmat — taxminan 50 millisekund. Agar har bir so'rovda yangi ulanish ochsak, 100 ta foydalanuvchi bo'lganda baza yiqiladi.

Pool — bu tayyor ulanishlar to'plami. Ochilib, qayta-qayta ishlatiladi.

pool_size=5 — doimiy 5 ta ulanish. max_overflow=10 — yuk oshsa, vaqtincha yana 10 ta. Jami 15.

pool_pre_ping=True — eng foydali parametr. Ulanishni ishlatishdan oldin "tiriksanmi?" deb tekshiradi. Busiz, baza qayta ishga tushsa, poolda o'lik ulanishlar qoladi va foydalanuvchi tushunarsiz xato ko'radi.

echo=False — har bir SQL ni terminalga chiqarmaydi. Darsda True qilib qo'ying — talabalar SQLAlchemy qanday SQL yasashini ko'rishadi. Bu juda foydali.

get_db — yield nega?

python6 qator
def get_db():
    db = SessionLocal()
    try:
        yield db          # <- sessiyani beradi
    finally:
        db.close()        # <- HAR DOIM yopadi

Bu FastAPI'ning dependency injection uslubi. yield dan keyingi kod so'rov tugagach ishlaydi — xato chiqsa ham.

finally bo'lmasa: xato chiqqanda sessiya yopilmaydi, pool to'ladi, ilova qotadi. Bu eng ko'p uchraydigan production xatolaridan biri.

Base nima

python1 qator
Base = declarative_base()

Bu — barcha jadval klasslarining ota-klassi. Keyingi bobda:

python2 qator
class Document(Base):
    __tablename__ = "documents"

Base orqali SQLAlchemy qaysi klasslar jadval ekanini biladi va Base.metadata.create_all() bilan hammasini yarata oladi.

Tekshirish

python6 qator
from app.database import SessionLocal
from sqlalchemy import text

db = SessionLocal()
print(db.execute(text("SELECT 1")).scalar())
db.close()

1 chiqsa — ulanish ishlayapti.

Agar connection refused chiqsa — PostgreSQL ishlamayapti. Agar database "rag_demo" does not exist chiqsa — bu normal. Bazani 5-bobda bootstrap.py yaratadi.


Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar