0Pricing
Python Academy · درس

نقاط النهاية غير المتزامنة وتكامل قواعد البيانات

اكتب معالجات مسارات غير متزامنة واتصل بقاعدة بيانات باستخدام SQLAlchemy

نقاط النهاية غير المتزامنة وتكامل قواعد البيانات درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

نقاط نهاية async def

صرّح بمعالجات المسارات باستخدام async def لإجراء عمليات الإدخال والإخراج غير الحاجزة. استخدم def للعمليات المقيدة بالمعالج أو الحاجزة، إذ يشغّلها 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 باعتباره تبعية في 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

تبعية قاعدة البيانات

أعد الجلسة باستخدام yield من تبعية في FastAPI، بحيث يجري اعتمادها وإغلاقها بعد الطلب.

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 async). أدر جلسة قاعدة البيانات باعتبارها تبعية في FastAPI. استخدم BackgroundTasks للعمل بعد إرسال الاستجابة، ومدير السياق lifespan لتشغيل تعليمات بدء التشغيل والإيقاف.

الأسئلة الشائعة

هل درس «نقاط النهاية غير المتزامنة وتكامل قواعد البيانات» مجاني؟

نعم — نص درس «نقاط النهاية غير المتزامنة وتكامل قواعد البيانات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «نقاط النهاية غير المتزامنة وتكامل قواعد البيانات»؟

اكتب معالجات مسارات غير متزامنة واتصل بقاعدة بيانات باستخدام SQLAlchemy تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «نقاط النهاية غير المتزامنة وتكامل قواعد البيانات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد مشروع FastAPI ونقطة النهاية الأولى
  2. معاملات المسار ومعاملات الاستعلام وأجسام الطلبات
  3. حقن الاعتماديات والمصادقة
  4. نقاط النهاية غير المتزامنة وتكامل قواعد البيانات
← العودة إلى Python Academy