1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人的備忘録:FastAPI開発中に遭遇した「session_id 不明」での404エラー解決メモ

Posted at

はじめに

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 の .envDATABASE_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の接続先にも注意が必要だと感じました...!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?