database.py — bazaga ulanish
Kichik fayl, lekin bitta muhim tushuncha bor: connection pool.
Kod
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?
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
Base = declarative_base()
Bu — barcha jadval klasslarining ota-klassi. Keyingi bobda:
class Document(Base): __tablename__ = "documents"
Base orqali SQLAlchemy qaysi klasslar jadval ekanini biladi va
Base.metadata.create_all() bilan hammasini yarata oladi.
Tekshirish
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.