SQLite 列类型

根据官方 SQLite 文档,存储在 SQLite 数据库中(或由数据库引擎操作)的每个值都具有以下存储类别之一:NULLINTEGERREALTEXTBLOB

我们原生支持所有 自定义类型,但如果这还不够,你可以随意创建 自定义类型

important

本部分文档中的所有示例均不使用数据库列名别名,列名均由 TypeScript 键生成。

如果需要,你可以在列名中使用数据库别名,也可以使用 casing 参数为 Drizzle 定义映射策略。

你可以阅读更多关于它的内容 此处

整数

有符号整数,根据值的大小,存储在 0123468 字节中。

import { integer, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	id: integer()
});

// you can customize integer mode to be number, boolean, timestamp, timestamp_ms
integer({ mode: 'number' })
integer({ mode: 'boolean' })
integer({ mode: 'timestamp_ms' })
integer({ mode: 'timestamp' }) // Date
CREATE TABLE `table` (
	`id` integer
);
// to make integer primary key auto increment
integer({ mode: 'number' }).primaryKey({ autoIncrement: true })
CREATE TABLE `table` (
	`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL
);

实际

浮点值,存储为 8-byte IEEE 浮点数。

import { real, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	real: real()
});
CREATE TABLE `table` (
	`real` real
);

文本

使用数据库编码(UTF-8UTF-16BEUTF-16LE)存储的文本字符串。

你可以定义 { enum: ["value1", "value2"] } 配置来推断 insertselect 类型,它不会检查运行时值。

import { text, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	text: text()
});

// will be inferred as text: "value1" | "value2" | null
text({ enum: ["value1", "value2"] })
text({ mode: 'json' })
text({ mode: 'json' }).$type<{ foo: string }>()
CREATE TABLE `table` (
	`text` text
);

Blob

数据块,按输入方式存储。

建议使用 text('', { mode: 'json' }) 而不是 blob('', { mode: 'json' }),因为它支持 JSON 函数:

目前,所有 JSON 函数如果其任何参数为 BLOB 类型,都会抛出错误,因为 BLOB 类型保留用于未来增强功能,届时 BLOB 将用于存储 JSON 的二进制编码。

请参阅 https://www.sqlite.org/json1.html

import { blob, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	blob: blob()
});

blob()
blob({ mode: 'buffer' })
blob({ mode: 'bigint' })

blob({ mode: 'json' })
blob({ mode: 'json' }).$type<{ foo: string }>()
CREATE TABLE `table` (
	`blob` blob
);

你可以指定 .$type<..>() 用于 Blob 推断,它不会检查运行时值。它为默认值、插入和选择模式提供编译时保护。

// will be inferred as { foo: string }
json: blob({ mode: 'json' }).$type<{ foo: string }>();

// will be inferred as string[]
json: blob({ mode: 'json' }).$type<string[]>();

// won't compile
json: blob({ mode: 'json' }).$type<string[]>().default({});

Boolean

SQLite 没有原生的 boolean 数据类型,但你可以指定 integer 列为 boolean 模式。这使得你可以在代码中操作布尔值,Drizzle 会将它们作为 0 和 1 整数值存储在数据库中。

import { integer, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	id: integer({ mode: 'boolean' })
});
CREATE TABLE `table` (
	`id` integer
);

Bigint

由于 SQLite 中没有 bigint 数据类型,Drizzle 为 blob 列提供了一种特殊的 bigint 模式。此模式允许你在代码中使用 BigInt 实例,Drizzle 会将它们作为 Blob 值存储在数据库中。

import { blob, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	id: blob({ mode: 'bigint' })
});
CREATE TABLE `table` (
	`id` blob
);

数值

import { blob, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	numeric: numeric(),
	numericNum: numeric({ mode: 'number' }),
	numericBig: numeric({ mode: 'bigint' }),
});
CREATE TABLE `table` (
	`numeric` numeric,
	`numericNum` numeric,
	`numericBig` numeric
);

自定义数据类型

每个列构建器都有一个 .$type() 方法,允许你自定义列的数据类型。例如,对于未知或品牌类型,这很有用。

type UserId = number & { __brand: 'user_id' };
type Data = {
	foo: string;
	bar: number;
};

const users = sqliteTable('users', {
  id: integer().$type<UserId>().primaryKey(),
  jsonField: blob().$type<Data>(),
});

不 null

NOT NULL 约束规定关联列不能包含 NULL 值。

const table = sqliteTable('table', { 
	numInt: integer().notNull() 
});
CREATE TABLE table (
	`numInt` integer NOT NULL
);

默认值

如果用户在执行 INSERT 时未明确提供值,则 DEFAULT 子句指定用于该列的默认值。如果列定义中没有附加显式 DEFAULT 子句,则该列的默认值为 NULL

显式 DEFAULT 子句可以指定默认值为 NULL、字符串常量、blob 常量、有符号数或任何括在括号中的常量表达式。

import { sql } from "drizzle-orm";
import { integer, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
	int1: integer().default(42),
	int2: integer().default(sql`(abs(42))`)
});
CREATE TABLE `table` (
	`int1` integer DEFAULT 42,
	`int2` integer DEFAULT (abs(42))
);

默认值也可以是与大小写无关的特殊关键字 CURRENT_TIMECURRENT_DATECURRENT_TIMESTAMP 之一。

import { sql } from "drizzle-orm";
import { text, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable("table", {
  time: text().default(sql`(CURRENT_TIME)`),
  date: text().default(sql`(CURRENT_DATE)`),
  timestamp: text().default(sql`(CURRENT_TIMESTAMP)`),
});
CREATE TABLE `table` (
	`time` text DEFAULT (CURRENT_TIME),
	`date` text DEFAULT (CURRENT_DATE),
	`timestamp` text DEFAULT (CURRENT_TIMESTAMP)
);

当使用“$default()”或“$defaultFn()”(它们只是同一函数的不同别名)时,你可以在运行时生成默认值,并在所有插入查询中使用这些值。这些函数可以帮助你使用各种实现,例如 uuidcuidcuid2 等等。

注意:此值不影响 drizzle-kit 的行为,仅在 drizzle-orm 运行时使用。

import { text, sqliteTable } from "drizzle-orm/sqlite-core";
import { createId } from '@paralleldrive/cuid2';

const table = sqliteTable('table', {
	id: text().$defaultFn(() => createId()),
});

当使用“$onUpdate()”或“$onUpdateFn()”(它们只是同一函数的不同别名)时,你可以在运行时生成默认值,并在所有更新查询中使用这些值。

向列添加动态更新值。该函数将在行更新时调用,如果未提供任何值,则返回值将用作列值。如果没有提供默认值(或 $defaultFn),则插入行时也会调用该函数,并将返回值用作列值。

注意:此值不影响 drizzle-kit 的行为,仅在 drizzle-orm 运行时使用。

import { text, sqliteTable } from "drizzle-orm/sqlite-core";

const table = sqliteTable('table', {
    alwaysNull: text().$type<string | null>().$onUpdate(() => null),
});