You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:35:09