为drizzle-orm&sqlite3 支持自动json列

40 阅读1分钟
import { sql } from 'drizzle-orm'
import { sqliteTable, text, integer, customType, index } from 'drizzle-orm/sqlite-core'

interface ObjectItem {
    name: string
    aget: number
}

export const testJson = sqliteTable('testJson', {
    id: integer('id').primaryKey({ autoIncrement: true }),
    name: text('name').notNull(),
    code: text('code'),
    createdAt: text('created_at')
        .notNull()
        .default(sql`(datetime('now', 'localtime'))`),
    json: json<ObjectItem>(),
})

默认drizzle-orm/sqlite-core中导出的只有基本列,如 int,text等类型。如果某些数据对象的字段是复杂属性(JSON最常见),需要自定义转换器来支持字段的自动序列化入库和反序列化解析

const json = customType<{ data: string; driverData: string }>({
    dataType: () => 'text',
    toDriver: (value) => {
        return value ? JSON.stringify(value) : ''
    },
    fromDriver: (value) => {
        return value ? JSON.parse(value) : value
    },
})

本质上存储还是以 text 类型为基底,只是在数据入库和出库时添加序列化处理,如上