はじめに
FastAPI でセッションに紐づくメッセージ処理を行う際、"セッションIDが見つからない"という問題が発生することがあります。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
本記事では、404エラーの原因となる session_id
の取り扱いと、正しく動作させるための対処法についてまとめます。
書こうと思ったきっかけ
受講しているITスクールのハッカソンの開発の一環で、セッションを利用したメッセージ保存機能を実装中、APIが404を返す現象に遭遇しました。原因調査と解決までの流れを記録しておきます。
内容
発生したエラー
FastAPI のログに以下のような記録がありました:
SELECT * FROM sessions WHERE sessions.id = 1 LIMIT 1;
ROLLBACK
"POST /api/sessions/1/messages HTTP/1.1" 404 Not Found
これは、セッションID 1 のレコードが sessions
テーブルに存在しておらず、クエリが失敗しているために発生しています。
主な原因と対処法
原因1: sessions テーブルに id = 1 の行が存在しない
この場合は、以下のような SQL で手動でデータを追加します:
INSERT INTO sessions (
id,
user_id,
character_mode,
created_at,
updated_at
) VALUES (
1,
1,
'saburo',
NOW(),
NOW()
);
原因2: 使用しているデータベースが想定と異なる
FastAPI の .env
や DATABASE_URL
の設定で、開発用のDBではなく別のDB(例:test用など)を見ている可能性があります。
その場合、想定しているデータが存在しないDBを参照しているため、見つからないことになります。
原因3: id カラムが SERIAL で、id=1 を手動指定できない
以下のように、id
を自動採番させて登録し、登録されたIDを確認する方法も有効です:
INSERT INTO sessions (
user_id,
character_mode,
created_at,
updated_at
) VALUES (
1,
'saburo',
NOW(),
NOW()
);
SELECT id FROM sessions ORDER BY id DESC LIMIT 1;
問題解決後のログ
セッションが存在する状態でメッセージ登録APIを呼び出すと、次のようなログが確認できました:
INSERT INTO messages (...) VALUES (...);
COMMIT
"POST /api/sessions/1/messages HTTP/1.1" 200 OK
このように、正常に INSERT および 200 OK が返されていれば、セッションの登録とAPI通信が成功していると判断できます。
まとめ
FastAPI でセッションIDを必要とする処理を行う際、事前にその session_id
が存在することが前提となります。
開発時は、必要なレコードを手動で挿入するか、ログイン処理などから自動生成・保存する設計が重要です。
また、複数の環境(dev/test/prod)を切り替えている場合は、DBの接続先にも注意が必要だと感じました...!