Reschemaのバックエンド実装(Python/FastAPI)(9/4)

2025-09-04
  • Reschemaのバックエンド実装(Python/FastAPI)
    • Python
  • secretsモジュール
  • randomはゲームなどセキュリティを必要としない箇所で使う、そうでないランダムな文字列・乱数を生成したい場合はsecretsモジュールを使うべき
  • contextlib.contextmanager コンテキストマネージャを簡単に生成できる
  • from contextlib import asynccontextmanager
  • コンテキストマネージャ=with構文。
    • SQLAlchemy
  • text() 構文
await self.session.execute(
   ` text("SET LOCAL app.current_tenant_id = :tenant_id"),
    {"tenant_id": str(tenant_id)},
)
  • 文字列を安全なSQL文として扱うことをAlchemyに伝える構文
  • :tenant_id
  • プリペアドステートメントと同じ仕組みでバインドパラメータ。SQLインジェクション対策
    • Unit of Workパターン
  • トランザクション管理、All or Nothing
    • Postgres / SQL
  • RLS(ROW LEVEL SECURITY)
CREATE POLICY tenant_isolation_organizations ON platform_private.organizations
    FOR ALL
    USING (id = platform_private.current_tenant_id());
  • FOR ALLはすべての操作に対して、SELECTだけUPDATEだけとかもできる
  • USING: 既存の行に対してのルール
  • WITH CHECK 新しく書き込まれる行に対してのルール(読み込みと書き込みに対してのルールが異なる場合に指定。新規ドキュメント作成の場合はdraftステータでなければならないとか)
  • FUNCTION / TRIGGER