drizzle如何处理mysql的bit类型

mysql 的 boolean 类型其实是 tinyint(1)的别名,一些 ORM 工具无法识别把他识别到对应语言的 boolean 类型,日常实践有时候会选择用bit(1)这个类型,比如javaJOOQ,boolean 类型会变为 java 的Byte,而bit(1)则是 java 的Boolean

但是 drizzle 的 mysql 内置类型中没有bit(1)。你用他的drizzle-kit pull之后会返回这个结果:

1
2
// Warning: Can't parse bit(1) from database
// bit(1)Type: bit(1)("deleted").notNull(),

但是如果是已经建好的表,其他逻辑在用的话,把bit(1)改成boolean并不方便。

需要我们自己定义一个类型。

bit(1)这个类型不同驱动返回不同,有些可能是作为整数,有些可能是作为 Buffer。所以扩展一下就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
export const bitBoolean = customType<{
data: boolean;
driverData: number | boolean;
}>({
dataType() {
return "bit(1)";
},
toDriver(value: boolean): number {
// 1 for true, 0 for false
return value ? 1 : 0;
},
fromDriver(value: unknown): boolean {
// either buffer or number
if (Buffer.isBuffer(value)) {
return value[0] === 1;
}
return value === 1;
},
});

使用就和普通类型一样:

1
enabled: bitBoolean("enabled").notNull(),

参考:
MySQL column types