Skip to content

FastAPI系の知識

alembic

Pydatic

  • data型
  • Separatorは「-」しか受け付けない(YYYYMMDDやYYYY/MM/DDはエラーになる)
  • YYYYMDDもエラーにされる(2025-09-01はOK、2025-9-01はエラー)

Access-Control-Allow-Originに関するエラーが発生した場合

  • バックエンド(今回はFastAPI)で対応する
from fastapi import FastAPI
from starlette.middleware import Middleware
from starlette.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "http://localhost:9000",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"]
)

@app.get("/")
async def read_root():
    return {"Hello": "World"}

python

  • .pycファイルとは
  • Pythonソースコード(.pyファイル)をPythonインタプリタが実行しやすいバイトコードに変換(コンパイル)した結果をキャッシュしたファイル

  • __init__.py

  • Pythonのディレクトリをパッケージとして認識させるためのファイル
    • 省略すると
    • unittestがテストモジュールを認識しない
    • lintツールがモジュールを正しく検出しない
    • 複数のモジュールが存在するプロジェクトでimportエラーが発生

Pytest

  • uv add --dev pytest pytest-asyncio httpx
  • uv add --dev pytest-env
  • pytest-asyncio
    • FastAPIのasync関数をテストできるようになる
  • httpx
    • FastAPIのテストクライアントとして使う
  • pytest-env

    • テスト用の環境変数を設定する際に必要
  • @pytest.fixture

  • テストのh前処理(DBをセットアップする、モックを作成するなど)を行うためのpytestの機能

    • そのため、常に実行したい初期処理などを定義する場合に使用する
    • autouse=Trueで、テスト関数にfixtureを指定せずとも、全てのテスト関数で自動的に実行される
    • scopeによって、どの範囲で実行されるかを指定可能
      • function(関数ごと)
      • class(クラスごと)
      • module(モジュールごと)
      • session(セッションごと)
  • pytest.ini

  • root配下に置く

  • テスト実行

  • pytest -v

Ruff導入

    uv add --dev ruff
  • チェック
  • uv run ruff check .

  • 自動修正(コードの修正を自動で行いたい場合は、--fixオプションを使用する)

  • uv run ruff check . --fix

  • エラー集

エラー番号 内容 対応策
UP017 datetime.timezone.utcの代わりにdatetime.UTCエイリアスを使いなさい datetime.UTCを使用する
B904 例外ハンドラ内でfrom句を使用せずに例外を再スローしないこと as ~ fromを使用する
# Ruff全体の挙動を制御する基本ブロック
[too.ruff]
line-length = 120   # 1行の最大文字数を設定(デフォルトは88)
target-version = "py311"    # 対象とするPythonバージョンを指定
include = 
exclude = [ # 除外したいファイルやフォルダを指定
    ".git",
    ".venv",
    "__pycache__",
    ".pytest_cache",
    ".mypy_cache",
    "alembic",
    "migrations",
]

[tool.ruff.lint]
select = [
  "A", # 一般的なコード品質に関連するルール
  "B", # pythonの最新の書き方かチェックする
  "C", # 複雑性に関連するルール
  "D", # ドキュメントに関連するルール
  "E", # Pycodestyleエラー
  "F", # 未使用import, 未定義変数が無いかチェックする
  "I", # importの並びを整列する
  "N", # 名前に関連するルール
  "Q", # クォートスタイルに関連するルール
  "R", # 冗長なコードに関連するルール
  "S", # セキュリティに関連するルール
  "T", # 型ヒントに関連するルール
  "UP", # Pythonのバージョンアップに関連するルール
]

[tool.ruff.format]
quote-style = "double"
indent-style = "space"

[tool.ruff.lint.per-file-ignores]
"src/routers/*.py" = ["B008"]
"migrations/env.py" = ["E402", "I001"]
"src/main.py" = ["E402", "I001"]

mypy導入

  • インストールコマンド
  • uv add --dev mypy

sqlalchemy

  • インストールコマンド
  • uv add sqlalchemy
  • ※uv pip install sqlalchemyでは依存関係が残らず、他の環境でエラーになる可能性あり

  • Mapped[str]と記述すると、自動的にnullable==Falseと解釈する

  • カラム名は属性名から自動名で決まるので、name=...は不要
  • カラム名
    • 実際のDBテーブルの列名
  • 属性名

    • Pythonのクラス属性名
  • create_engine

  • データべーへの接続口を作成する関数

Alembic

  • コマンド
  • インストール
    • uv add alembic
  • セットアップ

    • alembic init <ディレクトリ名>

    python # # 例) alembic init alembic # # 以下ディレクトリとファイルが生成される # migration/ # | - README # | - env.py # | - script.py.mako # | - versions/ # alembic.ini

    • マイグレーションの巻き戻し
    • alembic downgrade -1
    • 最新版のマイグレーションを適用
    • alembic upgrade head
    • マイグレーションファイルの作成
    • alembic revision --autogenerate -m "{ここがファイル名に付与される}"※--autogenerateを付与しないと空ファイルが作成される

python-dotenv

  • .envファイルを読み込めるようにするライブラリ
  • インストールコマンド
  • uv add python-dotenv