0Pricing
Python Academy · บทเรียน

เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล

เขียนตัวจัดการเส้นทางแบบอะซิงก์และเชื่อมต่อฐานข้อมูลด้วย SQLAlchemy

เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

จุดปลายทางด้วยฟังก์ชันแบบอะซิงโครนัส

ประกาศตัวจัดการเส้นทางด้วย async def สำหรับ I/O ที่ไม่บล็อก ใช้ def สำหรับการดำเนินการที่ใช้ CPU หนักหรือบล็อกการทำงาน (FastAPI จะเรียกใช้การดำเนินการเหล่านี้ในกลุ่มเธรด)

from fastapi import FastAPI
import asyncio
app = FastAPI()

@app.get("/slow")
async def slow():
    await asyncio.sleep(1)   # non-blocking
    return {"done": True}

asyncpg สำหรับ PostgreSQL

asyncpg เป็นไดรเวอร์ PostgreSQL แบบอะซิงโครนัสที่ทำงานรวดเร็ว ใช้กลุ่มการเชื่อมต่อที่ใช้ร่วมกันระหว่างคำขอ

# pip install asyncpg
import asyncpg, asyncio

async def main():
    pool = await asyncpg.create_pool("postgresql://user:pass@host/db")
    async with pool.acquire() as conn:
        rows = await conn.fetch("SELECT id, name FROM users")
    await pool.close()
    return rows

SQLAlchemy แบบอะซิงโครนัส

SQLAlchemy 1.4+ ร่วมกับ async_sessionmaker มี ORM แบบอะซิงโครนัสให้ใช้ ใช้ AsyncSession เป็น dependency ของ FastAPI

# pip install sqlalchemy aiosqlite
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker

engine = create_async_engine("sqlite+aiosqlite:///db.sqlite")
AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False)

async def get_db():
    async with AsyncSessionLocal() as session:
        yield session

Dependency ของฐานข้อมูล

ส่งคืนเซสชันจาก dependency ของ FastAPI ด้วย yield เพื่อให้เซสชันถูก commit และปิดหลังจากคำขอเสร็จสิ้น

from fastapi import Depends, FastAPI
from sqlalchemy.ext.asyncio import AsyncSession
app = FastAPI()

async def get_db():
    async with AsyncSessionLocal() as session:
        yield session

@app.get("/users")
async def get_users(db: AsyncSession = Depends(get_db)):
    result = await db.execute(select(User))
    return result.scalars().all()

โมเดล ORM ของ SQLAlchemy

กำหนดโมเดล ORM ด้วย DeclarativeBase และแมปโมเดลเหล่านั้นกับตารางในฐานข้อมูล

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

class Base(DeclarativeBase): pass

class User(Base):
    __tablename__ = "users"

    id:    Mapped[int] = mapped_column(primary_key=True)
    name:  Mapped[str]
    email: Mapped[str]

การดำเนินการ CRUD

นำการสร้าง การอ่าน การอัปเดต และการลบข้อมูลพื้นฐานมาใช้ด้วยเมธอดของเซสชันแบบอะซิงโครนัสของ SQLAlchemy

from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

async def create_user(db: AsyncSession, name: str, email: str):
    user = User(name=name, email=email)
    db.add(user)
    await db.commit()
    await db.refresh(user)
    return user

async def get_user(db: AsyncSession, user_id: int):
    result = await db.execute(select(User).where(User.id == user_id))
    return result.scalar_one_or_none()

Alembic สำหรับการย้ายโครงสร้างฐานข้อมูล

ใช้ Alembic เพื่อจัดการการย้ายโครงสร้างฐานข้อมูลด้วยวิธีที่ควบคุมเวอร์ชันได้

# pip install alembic
# alembic init alembic
# Edit alembic/env.py to point to your models

# Generate a migration:
# alembic revision --autogenerate -m "add users table"

# Apply:
# alembic upgrade head

httpx สำหรับการเรียก HTTP แบบอะซิงโครนัส

ใช้ httpx.AsyncClient เพื่อเรียก API ภายนอกจากจุดปลายทาง FastAPI แบบอะซิงโครนัส

# pip install httpx
import httpx
from fastapi import FastAPI
app = FastAPI()

@app.get("/weather")
async def weather(city: str):
    async with httpx.AsyncClient() as client:
        r = await client.get(f"https://wttr.in/{city}?format=j1")
        return r.json()

งานเบื้องหลัง

ใช้ BackgroundTasks เพื่อทำงานหลังจากส่งการตอบกลับแล้ว เช่น ส่งอีเมลหรืออัปเดตแคช

from fastapi import FastAPI, BackgroundTasks
app = FastAPI()

def send_welcome_email(email: str):
    # blocking I/O — runs in background thread
    smtp_send(email, "Welcome!")

@app.post("/register")
def register(email: str, bg: BackgroundTasks):
    create_user(email)
    bg.add_task(send_welcome_email, email)
    return {"status": "registered"}

เหตุการณ์ตามช่วงอายุการทำงาน

ใช้ตัวจัดการบริบท lifespan (FastAPI 0.93 ขึ้นไป) เพื่อเรียกใช้โค้ดเริ่มต้นและปิดการทำงาน เช่น สร้างกลุ่มการเชื่อมต่อฐานข้อมูล

from contextlib import asynccontextmanager
from fastapi import FastAPI

@asynccontextmanager
async def lifespan(app: FastAPI):
    app.state.pool = await asyncpg.create_pool(DSN)
    yield
    await app.state.pool.close()

app = FastAPI(lifespan=lifespan)

การทดสอบ FastAPI ด้วย httpx

ใช้ httpx.AsyncClient ร่วมกับ ASGITransport เพื่อทดสอบจุดปลายทาง FastAPI โดยไม่ต้องเรียกใช้เซิร์ฟเวอร์

import pytest, httpx
from fastapi import FastAPI
app = FastAPI()

@app.get("/ping")
async def ping(): return {"pong": True}

@pytest.mark.asyncio
async def test_ping():
    async with httpx.AsyncClient(
        transport=httpx.ASGITransport(app=app),
        base_url="http://test"
    ) as client:
        r = await client.get("/ping")
    assert r.json() == {"pong": True}

ตรวจสอบความเข้าใจ

ควรใช้ async def แทน def สำหรับตัวจัดการเส้นทาง FastAPI เมื่อใด

สรุปทบทวน

ใช้จุดปลายทาง async def ร่วมกับไดรเวอร์ฐานข้อมูลแบบอะซิงโครนัส (asyncpg และ SQLAlchemy แบบอะซิงโครนัส) จัดการเซสชันฐานข้อมูลเป็น dependency ของ FastAPI ใช้ BackgroundTasks สำหรับงานหลังส่งการตอบกลับ และใช้ตัวจัดการบริบท lifespan สำหรับโค้ดเริ่มต้นและปิดการทำงาน

คำถามที่พบบ่อย

บทเรียน “เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล”

เขียนตัวจัดการเส้นทางแบบอะซิงก์และเชื่อมต่อฐานข้อมูลด้วย SQLAlchemy คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่าโปรเจกต์ FastAPI และเอนด์พอยต์แรก
  2. พารามิเตอร์เส้นทาง พารามิเตอร์คำค้น และบอดีคำขอ
  3. การแทรกการพึ่งพาและการยืนยันตัวตน
  4. เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล
← กลับไปที่ Python Academy