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