- Reschemaのバックエンド実装(Python/FastAPI)
- secretsモジュール
- randomはゲームなどセキュリティを必要としない箇所で使う、そうでないランダムな文字列・乱数を生成したい場合はsecretsモジュールを使うべき
- contextlib.contextmanager コンテキストマネージャを簡単に生成できる
from contextlib import asynccontextmanager
- コンテキストマネージャ=with構文。
text() 構文
await self.session.execute(
` text("SET LOCAL app.current_tenant_id = :tenant_id"),
{"tenant_id": str(tenant_id)},
)
- 文字列を安全なSQL文として扱うことをAlchemyに伝える構文
:tenant_id
- プリペアドステートメントと同じ仕組みでバインドパラメータ。SQLインジェクション対策
- トランザクション管理、All or Nothing
- 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