import { type Kysely, sql } from "kysely"; // 迁移辅助:迁移以原生 DDL 书写,便于评审与对照 REQ §12。 // 注意:已发布迁移引用的辅助函数行为不得再改变,只能新增函数。 /** 执行一段不带参数的 DDL(可含多条语句,pg 简单查询协议) */ // biome-ignore lint/suspicious/noExplicitAny: 迁移不依赖应用表类型 export async function execDdl(db: Kysely, ddl: string): Promise { await sql.raw(ddl).execute(db); } /** text 列的枚举 CHECK:`check (col in ('a','b'))` */ export function oneOf(column: string, values: readonly string[]): string { return `check (${column} in (${values.map((v) => `'${v.replace(/'/g, "''")}'`).join(", ")}))`; } /** * 标准实体表:uuid 主键 + created_at/updated_at + updated_at 自动刷新触发器。 * body 为其余列与表级约束(逗号分隔,不含首尾逗号)。 */ export function entityTable(name: string, body: string): string { return ` create table ${name} ( id uuid primary key default gen_random_uuid(), ${body.trim()}, created_at timestamptz not null default now(), updated_at timestamptz not null default now() ); create trigger ${name}_touch_updated_at before update on ${name} for each row execute function umt_touch_updated_at(); `; } /** 按顺序 drop 表(调用方按依赖逆序传入) */ export function dropTables(names: readonly string[]): string { return names.map((n) => `drop table if exists ${n} cascade;`).join("\n"); }