CodeBlanks Logo Icon CodeBlanks

SQLAlchemy katmanı

SQLAlchemy ile veritabanı işlemleri yazarsın.

SQLAlchemy katmanı

Üçüncü katman, sabit listeyi gerçek bir veritabanı sorgusuyla değiştirir. SQLAlchemy ile bellek içi SQLite kurar, bir Task modeli tanımlar ve session.query(Task).all() ile sorgularız.

from sqlalchemy import create_engine, Column, Integer, String, StaticPool
from sqlalchemy.orm import declarative_base, sessionmaker

engine = create_engine("sqlite:///:memory:", poolclass=StaticPool)

Bellek içi SQLite, StaticPool olmadan her bağlantıda yeni bir veritabanı oluşturur. FastAPI TestClient ayrı bir iş parçacığı kullanacağından, check_same_thread=False ve StaticPool bağlantıyı paylaşmak için şarttır.

Task modeli

SQLAlchemy modeli, declarative_base()'ten türetilmiş bir sınıftır. __tablename__ tablo adını, Column ise sütunları tanımlar.

class Task(Base):
    __tablename__ = "tasks"
    id = Column(Integer, primary_key=True)
    title = Column(String)

Bu sınıf, Python nesneleriyle veritabanı satırları arasında bir köprüdür. session.add(Task(...)) ile yeni satır ekler; session.commit() ile kalıcı yaparsın. Sorgu, sınıf adından tabloya otomatik geçer.

Uygulama Task modeli ve veritabanı sorgusu ekle

Başlangıç kodu, önceki dersin fetch_tasks ve fetch_all çözümlerini içerir. Şunları ekle:

  • from sqlalchemy import create_engine, Column, Integer, String, StaticPool
  • from sqlalchemy.orm import declarative_base, sessionmaker
  • Base = declarative_base()
  • class Task(Base): — __tablename__ = "tasks", id = Column(Integer, primary_key=True), title = Column(String)
  • Motoru oluştur: engine = create_engine("sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool)
  • Base.metadata.create_all(engine), Session = sessionmaker(bind=engine), session = Session()
  • İki Task ekle ve commit yap
  • fetch_tasks'i yeniden tanımla: return [{"id": t.id, "title": t.title} for t in session.query(Task).all()]

Sonra print(asyncio.run(fetch_tasks())) ile sonucu yazdır.

Başlangıç kodu

main.py
import asyncio

async def fetch_tasks():
    return [{"id": 1, "title": "Görev 1"}, {"id": 2, "title": "Görev 2"}]

async def fetch_all():
    return await asyncio.gather(fetch_tasks(), fetch_tasks())

# sqlalchemy'den create_engine, Column, Integer, String, StaticPool'ü içe aktar
# sqlalchemy.orm'dan declarative_base ve sessionmaker'ı içe aktar
# Base'i tanımla, Task modelini yaz (id, title sütunları)
# motoru oluştur (bellek içi sqlite, StaticPool, check_same_thread=False)
# tabloları yarat, oturum aç, iki Task ekle ve commit yap
# fetch_tasks'i veritabanından sorgu yapacak şekilde yeniden tanımla
# asyncio.run ile fetch_tasks'i çalıştır ve sonucu yazdır

Örnek çözüm

main.py
import asyncio

async def fetch_tasks():
    return [{"id": 1, "title": "Görev 1"}, {"id": 2, "title": "Görev 2"}]

async def fetch_all():
    return await asyncio.gather(fetch_tasks(), fetch_tasks())

from sqlalchemy import create_engine, Column, Integer, String, StaticPool
from sqlalchemy.orm import declarative_base, sessionmaker

Base = declarative_base()

class Task(Base):
    __tablename__ = "tasks"
    id = Column(Integer, primary_key=True)
    title = Column(String)

engine = create_engine(
    "sqlite:///:memory:",
    connect_args={"check_same_thread": False},
    poolclass=StaticPool,
)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
session.add(Task(id=1, title="Görev 1"))
session.add(Task(id=2, title="Görev 2"))
session.commit()

async def fetch_tasks():
    return [{"id": t.id, "title": t.title} for t in session.query(Task).all()]

print(asyncio.run(fetch_tasks()))

Beklenen çıktı

[{'id': 1, 'title': 'Görev 1'}, {'id': 2, 'title': 'Görev 2'}]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 FastAPI TestClient ile bellek içi SQLite kullanırken ne gerekir?

  • Ek ayar gerekmez
  • StaticPool ve check_same_thread=False Doğru cevap
  • Yalnızca StaticPool
  • Yalnızca check_same_thread=False

Açıklama: StaticPool bağlantıyı paylaşır; check_same_thread=False iş parçacığına izin verir.

2 Tablo adını tamamla

Soru
class Task(Base):
    ____ = "tasks"
Cevap
class Task(Base):
    __tablename__ = "tasks"

Açıklama: __tablename__ tablo adını belirler.

3 SQLAlchemy kavramlarını eşleştir

Kavram Anlamı
create_engine Motor oluşturur
declarative_base Model temeli
Column Sütun tanımlar
session.query Sorgu yapar

İleri seviye bölümündeki tüm dersler