refactor(db): 精简 generatedFields,删三分支 PK 策略与泛型 keys 工具

- 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 的内部组合
This commit is contained in:
2026-04-24 20:37:51 +08:00
parent 2678a53034
commit 22ac02cbc6
+8 -48
View File
@@ -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 = <T extends Record<string, unknown>>(fields: T): Record<keyof T, true> => {
return Object.keys(fields).reduce(
(acc, key) => {
acc[key as keyof T] = true
return acc
},
{} as Record<keyof T, true>,
)
}
export const generatedFieldKeys = createGeneratedFieldKeys(generatedFields)
export const generatedFieldKeys = { id: true, createdAt: true, updatedAt: true } as const