PythonのFast APIを学び忘れた方向けの超簡単なチュートリアル

# FastAPIで始めるPython Web開発

FastAPIは、PythonでAPIを迅速に開発するためのモダンなフレームワークです。以下では、FastAPIを使用して基本的なCRUD（Create, Read, Update, Delete）アプリケーションを構築する方法を詳しく説明します。

## FastAPIの基本

FastAPIは、Pythonの型ヒントを活用して、開発者が少ないコードで強力なAPIを構築できるように設計されています。これにより、開発速度が向上し、バグを減らすことができます。また、FastAPIは非同期処理をサポートしており、高速なパフォーマンスを実現します。

### インストール

まず、FastAPIとASGIサーバーの`uvicorn`をインストールします。

```bash
pip install fastapi uvicorn
```

## プロジェクトのセットアップ

FastAPIプロジェクトをセットアップするために、ディレクトリ構造を以下のようにします。

```
fastapi-crud-example/
│ db.py
│ main.py
├─users
│ │ models.py
│ │ router.py
│ └─schemas.py
└─utils
  dbutils.py
```

### データベース接続

データベースには`SQLAlchemy`を使用します。以下は`db.py`の例です。

```python
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()
```

## モデルとスキーマの定義

データベースモデルとPydanticスキーマを定義します。

### モデル

`users/models.py`でユーザーモデルを定義します。

```python
from sqlalchemy import Column, Integer, String
from db import Base

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    email = Column(String, unique=True, index=True)
```

### スキーマ

`users/schemas.py`でPydanticスキーマを定義します。

```python
from pydantic import BaseModel

class UserBase(BaseModel):
    name: str
    email: str

class UserCreate(UserBase):
    pass

class User(UserBase):
    id: int

    class Config:
        orm_mode = True
```

## CRUD操作の実装

`users/router.py`でCRUD操作を実装します。

```python
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from db import SessionLocal
from . import models, schemas

router = APIRouter()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@router.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = models.User(name=user.name, email=user.email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

@router.get("/users/{user_id}", response_model=schemas.User)
def read_user(user_id: int, db: Session = Depends(get_db)):
    db_user = db.query(models.User).filter(models.User.id == user_id).first()
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user
```

## アプリケーションの起動

`main.py`でFastAPIアプリケーションを起動します。

```python
from fastapi import FastAPI
from users.router import router as user_router
from db import Base, engine

Base.metadata.create_all(bind=engine)

app = FastAPI()

app.include_router(user_router, prefix="/api/v1")
```

アプリケーションを起動するには、以下のコマンドを実行します。

```bash
uvicorn main:app --reload
```

## テスト

FastAPIは自動的にSwagger UIを生成するため、ブラウザで`http://127.0.0.1:8000/docs`にアクセスしてAPIをテストできます。これにより、エンドポイントの動作を簡単に確認できます。

---

このブログ記事を通じて、FastAPIを使用した基本的なCRUDアプリケーションの構築方法を学びました。FastAPIはその高速性と使いやすさから、PythonでのAPI開発に非常に適しています。ぜひ、実際のプロジェクトで試してみてください。