From 22ac02cbc6feb26ca1693af7c1dbf0a79a5ab344 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Fri, 24 Apr 2026 20:37:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor(db):=20=E7=B2=BE=E7=AE=80=20generatedF?= =?UTF-8?q?ields=EF=BC=8C=E5=88=A0=E4=B8=89=E5=88=86=E6=94=AF=20PK=20?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E4=B8=8E=E6=B3=9B=E5=9E=8B=20keys=20?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PK 策略原本给了 native(PG18)/extension/app-side 三条路,对 base 项目 是 YAGNI。全部落到最稳妥的 $defaultFn(uuidv7):任意 PG 版本都能跑, 不依赖扩展或 18+ 的 uuidv7() 原生函数 - createGeneratedFieldKeys 泛型 reduce 只为了生成 { id: true, createdAt: true, updatedAt: true } 这三项,直接手写 as const 更直观 - 删掉 pk/id/createdAt/updatedAt 的独立 helper 导出——没人引用,它们 只是 generatedFields 的内部组合 --- src/server/db/fields.ts | 56 ++++++----------------------------------- 1 file changed, 8 insertions(+), 48 deletions(-) diff --git a/src/server/db/fields.ts b/src/server/db/fields.ts index afea8cc..f7868d9 100644 --- a/src/server/db/fields.ts +++ b/src/server/db/fields.ts @@ -1,55 +1,15 @@ -import { sql } from 'drizzle-orm' import { timestamp, uuid } from 'drizzle-orm/pg-core' import { v7 as uuidv7 } from 'uuid' -// id - -const id = (name: string) => uuid(name) -export const pk = (name: string, strategy?: 'native' | 'extension') => { - switch (strategy) { - // PG 18+ - case 'native': - return id(name).primaryKey().default(sql`uuidv7()`) - - // PG 13+ with extension - case 'extension': - return id(name).primaryKey().default(sql`uuid_generate_v7()`) - - // Any PG version - default: - return id(name) - .primaryKey() - .$defaultFn(() => uuidv7()) - } -} - -// timestamp - -export const createdAt = (name = 'created_at') => timestamp(name, { withTimezone: true }).notNull().defaultNow() - -export const updatedAt = (name = 'updated_at') => - timestamp(name, { withTimezone: true }) +export const generatedFields = { + id: uuid('id') + .primaryKey() + .$defaultFn(() => uuidv7()), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), + updatedAt: timestamp('updated_at', { withTimezone: true }) .notNull() .defaultNow() - .$onUpdateFn(() => new Date()) - -// generated fields - -export const generatedFields = { - id: pk('id'), - createdAt: createdAt('created_at'), - updatedAt: updatedAt('updated_at'), + .$onUpdateFn(() => new Date()), } -// Helper to create omit keys from generatedFields -const createGeneratedFieldKeys = >(fields: T): Record => { - return Object.keys(fields).reduce( - (acc, key) => { - acc[key as keyof T] = true - return acc - }, - {} as Record, - ) -} - -export const generatedFieldKeys = createGeneratedFieldKeys(generatedFields) +export const generatedFieldKeys = { id: true, createdAt: true, updatedAt: true } as const