راهاندازی پروژه FastAPI با GraphQL و اتصال به دیتابیس (مرحله اولیه)
در این بخش علاوه بر ساختار پروژه و نصب کتابخانهها، اتصال اولیه به دیتابیس PostgreSQL با استفاده از SQLAlchemy و Alembic را هم راهاندازی میکنیم. همچنین برای اطمینان از صحت نصب، Router مربوط به GraphQL را بدون تعریف Query واقعی اضافه میکنیم. همچنان وارد پیادهسازی Schema جدی نمیشویم.
پیشنیازها
- Python 3.8 یا بالاتر
- PostgreSQL نصب و آماده
- محیط مجازی (virtual environment) فعال
python -m venv venv
source venv/bin/activate   # برای Linux/macOS
venv\Scripts\activate      # برای Windows
نصب کتابخانههای موردنیاز
pip install fastapi strawberry-graphql uvicorn sqlalchemy psycopg2-binary alembic python-dotenv
- sqlalchemy: ORM برای مدیریت دیتابیس
- psycopg2-binary: درایور PostgreSQL
- alembic: مدیریت migration ها
- python-dotenv: بارگذاری تنظیمات محیطی از فایل .env
- strawberry-graphql: کتابخانه GraphQL
ساختار پیشنهادی پروژه
project/
│
├── alembic/               # فایلها و پوشههای migration
├── config/                # تنظیمات و مدیریت دیتابیس
│   ├── __init__.py
│   ├── settings.py        # مدیریت متغیرهای محیطی با Pydantic
│   └── database.py        # اتصال به دیتابیس و SessionLocal
│
├── models/                # جداول دیتابیس
│   ├── __init__.py
│   ├──  users.py
│   └──  tasks.py
├── schemas/               # Pydantic schemas
│   ├── __init__.py
│   ├──  users.py
│   └──  tasks.py
│
├── graphql/               # Graphql schemas
│   ├── __init__.py
│   ├──  users.py
│   └──  tasks.py
│
├── routes/                # API/GraphQL routes
│   ├── __init__.py
│   ├──  users.py
│   └──  tasks.py
│
├── schema.py              # فایل GraphQL (در مراحل بعدی)
├── main.py                # نقطه ورود برنامه FastAPI
├── .env                   # تنظیمات محیطی
└── venv/                  # محیط مجازی
۱. فایل .env
DATABASE_URL=postgresql+psycopg2://username:password@localhost:5432/mydb
تنظیمات environment برای پروژه
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
    DATABASE_URL: str
    class Config:
        env_file = ".env"
settings = Settings()
۲. فایل database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from config.settings import settings
engine = create_engine(settings.DATABASE_URL, echo=True, future=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
۳. فایل models.py
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean, Text
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from database import Base
class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    email = Column(String, unique=True, index=True, nullable=False)
    password = Column(String, nullable=False)
    created_date = Column(DateTime(timezone=True), server_default=func.now())
    updated_date = Column(DateTime(timezone=True), onupdate=func.now())
    # ارتباط یکبهچند با Task
    tasks = relationship("Task", back_populates="user")
class Task(Base):
    __tablename__ = "tasks"
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, nullable=False)
    description = Column(Text, nullable=True)
    is_completed = Column(Boolean, default=False)
    created_date = Column(DateTime(timezone=True), server_default=func.now())
    updated_date = Column(DateTime(timezone=True), onupdate=func.now())
    user_id = Column(Integer, ForeignKey("users.id"))
    user = relationship("User", back_populates="tasks")
۴. فایل schema.py
برای اینکه GraphQL بالا بیاید، یک اسکیمای آزمایشی ساده تعریف میکنیم:
import strawberry
@strawberry.type
class Query:
    hello: str = "Hello GraphQL!"
schema = strawberry.Schema(query=Query)
۵. فایل main.py
from fastapi import FastAPI, Depends
from strawberry.fastapi import GraphQLRouter
from sqlalchemy.orm import Session
from database import SessionLocal, engine, Base
import models
from schema import schema
app = FastAPI()
# ساخت جداول در دیتابیس (در محیط توسعه)
Base.metadata.create_all(bind=engine)
# Dependency برای دسترسی به دیتابیس
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
# اضافه کردن Router مربوط به GraphQL
graphql_app = GraphQLRouter(schema)
app.include_router(graphql_app, prefix="/graphql")
@app.get("/")
def root():
    return {"message": "Hello FastAPI with GraphQL and DB!"}
۶. راهاندازی Alembic
alembic init alembic
سپس در فایل alembic.ini مقدار sqlalchemy.url را با DATABASE_URL جایگزین کنید یا از env.py فایل Alembic برای بارگذاری .env استفاده کنید.
ایجاد migration اولیه:
alembic revision --autogenerate -m "init db"
alembic upgrade head
۷. اجرای پروژه
uvicorn main:app --reload
اکنون سرویس در آدرس http://localhost:8000/ در دسترس است. همچنین در آدرس http://localhost:8000/graphql محیط GraphQL آماده است و میتوانید Query ساده { hello } را تست کنید.
جمعبندی
در این مرحله شما پروژه FastAPI را به PostgreSQL متصل کردهاید، محیط دیتابیس را آماده کردهاید، Alembic را برای migration راهاندازی کردهاید و Router اولیه GraphQL را هم اضافه کردهاید. فعلاً فقط یک Query آزمایشی داریم، ولی ساختار کامل برای توسعه بعدی آماده است.