如何在drizzle-orm(mysql-core)中创建Set类型字段?
在Drizzle ORM(MySQL)中自定义Set数据类型实现星期数组存储
1. 自定义Weekday Set数据类型
Drizzle ORM支持通过customType扩展MySQL数据类型,我们可以实现一个映射MySQL原生SET类型的自定义类型,处理数组与逗号分隔字符串的双向转换:
import { customType } from 'drizzle-orm/mysql-core'; // 限定允许的星期值类型 type Weekday = 'mon' | 'tue' | 'wed' | 'thur' | 'fri' | 'sat' | 'sun'; type WeekdaySet = Weekday[]; // 自定义Set类型 export const weekdaySet = customType<{ data: WeekdaySet; driverData: string }>({ dataType() { // 返回MySQL的SET类型定义,枚举所有合法值 return "SET('mon', 'tue', 'wed', 'thur', 'fri', 'sat', 'sun')"; }, // 应用层数组转数据库存储的逗号分隔字符串 toDriver(value: WeekdaySet): string { return value.join(','); }, // 数据库返回的字符串转应用层数组 fromDriver(value: string): WeekdaySet { // 处理空字符串情况(如果字段允许为空) return value ? (value.split(',') as WeekdaySet) : []; }, });
2. 使用自定义类型创建数据表
在表结构定义中直接引入并使用这个自定义类型:
import { mysqlTable, varchar } from 'drizzle-orm/mysql-core'; import { weekdaySet } from './path-to-your-custom-type'; export const schedules = mysqlTable('schedules', { id: varchar('id', { length: 36 }).primaryKey(), scheduleName: varchar('schedule_name', { length: 100 }).notNull(), availableDays: weekdaySet('available_days').notNull(), // 绑定自定义字段 });
3. 增删改查操作示例
插入数据
import { db } from './path-to-your-db-connection'; import { schedules } from './path-to-your-schema'; await db.insert(schedules).values({ id: 'user-schedule-001', scheduleName: '周末值班', availableDays: ['sat', 'sun'], });
查询数据
import { eq } from 'drizzle-orm'; const targetSchedule = await db.select() .from(schedules) .where(eq(schedules.id, 'user-schedule-001')) .get(); // targetSchedule.availableDays 会自动解析为 ['sat', 'sun']
注意事项
- 确保传入
availableDays的数组值均为预定义的Weekday类型,否则MySQL会抛出无效SET值的错误 - 如果需要允许字段为空,可将自定义类型的
data改为WeekdaySet | null,并在toDriver和fromDriver中处理null情况 - MySQL原生
SET类型最多支持64个不同枚举值,本场景的7个值完全符合限制
内容的提问来源于stack exchange,提问作者Michel Esteban Solarte
相关产品推荐
相关产品推荐

