用途:在 latitude-llm 项目中处理 Postgres 数据层,包括 Drizzle schema、仓储实现、行级安全(RLS)、SqlClient 接线、迁移与平台映射器。
主要能力:Postgres 适配栈位于 packages/platform/db-postgres,使用 Drizzle ORM;领域模型与表/行结构解耦,行到领域对象的映射放在平台适配器。所有数据库访问经 SqlClient,由边界提供 SqlClientLive 并携带组织上下文以启用 RLS。每个事务自动设置 app.current_organization_id 会话变量,RLS 策略据此过滤查询;嵌套事务共享同一连接。
使用方式:边界层用 Effect.provide(SqlClientLive(client, organizationId)) 注入;用例内通过 sqlClient.transaction(...) 组合多操作;仓储方法须在每次调用内解析 SqlClient,不得在 layer 构建时捕获。查询回调 query((db, organizationId) => …) 从 RLS 上下文取 organizationId,用于 WHERE 与 INSERT,不要作为方法参数重复传入。仓储端口方法签名需在 R 通道列出 SqlClient。
Schema 约定:使用 latitudeSchema、cuid("id").primaryKey()、tzTimestamp、timestamps()、organizationRLSPolicy;新表不加外键,改用关系列索引。
迁移:使用 drizzle-kit,命令为 pnpm --filter @platform/db-postgres pg:generate "<name>"、pg:generate:custom "<name>"、pg:migrate;迁移历史只追加,不编辑既有文件,不在 drizzle 目录手写 SQL。除非用户明确要求,不要运行迁移命令。
管理:连接开发库 docker compose exec postgres psql -U latitude -d latitude_development;重置 pnpm --filter @platform/db-postgres pg:reset。
限制:映射器不得硬编码字段值、不得用 as 断言、不得用 ?? 兜底可空列,toInsertRow 必须与 toDomain* 可往返。其余细节暂未提供。