نصب و راه‌اندازی پروژه اولیه با FastAPI و Strawberry

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/03/17
  • تعداد بازدید: 3

راه‌اندازی پروژه 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 آزمایشی داریم، ولی ساختار کامل برای توسعه بعدی آماده است.

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.