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:
+7
-47
@@ -1,55 +1,15 @@
|
|||||||
import { sql } from 'drizzle-orm'
|
|
||||||
import { timestamp, uuid } from 'drizzle-orm/pg-core'
|
import { timestamp, uuid } from 'drizzle-orm/pg-core'
|
||||||
import { v7 as uuidv7 } from 'uuid'
|
import { v7 as uuidv7 } from 'uuid'
|
||||||
|
|
||||||
// id
|
export const generatedFields = {
|
||||||
|
id: 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()
|
.primaryKey()
|
||||||
.$defaultFn(() => uuidv7())
|
.$defaultFn(() => uuidv7()),
|
||||||
}
|
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
||||||
}
|
updatedAt: timestamp('updated_at', { withTimezone: true })
|
||||||
|
|
||||||
// timestamp
|
|
||||||
|
|
||||||
export const createdAt = (name = 'created_at') => timestamp(name, { withTimezone: true }).notNull().defaultNow()
|
|
||||||
|
|
||||||
export const updatedAt = (name = 'updated_at') =>
|
|
||||||
timestamp(name, { withTimezone: true })
|
|
||||||
.notNull()
|
.notNull()
|
||||||
.defaultNow()
|
.defaultNow()
|
||||||
.$onUpdateFn(() => new Date())
|
.$onUpdateFn(() => new Date()),
|
||||||
|
|
||||||
// generated fields
|
|
||||||
|
|
||||||
export const generatedFields = {
|
|
||||||
id: pk('id'),
|
|
||||||
createdAt: createdAt('created_at'),
|
|
||||||
updatedAt: updatedAt('updated_at'),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper to create omit keys from generatedFields
|
export const generatedFieldKeys = { id: true, createdAt: true, updatedAt: true } as const
|
||||||
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)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user