本部分文档中的所有示例均未使用数据库列名别名,列名是从 TypeScript 键生成的。
如果需要,您可以在列名中使用数据库别名,并且您还可以使用 casing 参数为 Drizzle 定义映射策略。
您可以在 这里 了解更多信息。
根据官方 SQLite 文档,
每个存储在 SQLite 数据库中的值(或被数据库引擎操作的值)
都具有以下存储类别之一:NULL、INTEGER、REAL、TEXT 和 BLOB。
我们对它们都提供了原生支持,如果这还不够,欢迎创建 自定义类型。
本部分文档中的所有示例均未使用数据库列名别名,列名是从 TypeScript 键生成的。
如果需要,您可以在列名中使用数据库别名,并且您还可以使用 casing 参数为 Drizzle 定义映射策略。
您可以在 这里 了解更多信息。
一个有符号整数,存储为 0、1、2、3、4、6 或 8 字节,具体取决于值的大小。
import { integer, sqliteTable } from "drizzle-orm/sqlite-core";
const table = sqliteTable('table', {
id: integer()
});
// 您可以自定义整数模式为 number、boolean、timestamp、timestamp_ms
integer({ mode: 'number' })
integer({ mode: 'boolean' })
integer({ mode: 'timestamp_ms' })
integer({ mode: 'timestamp' }) // Date
CREATE TABLE `table` (
`id` integer
);// 使整数主键自动递增
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-8、UTF-16BE 或 UTF-16LE)存储。
您可以定义 { enum: ["value1", "value2"] } 配置来推导 insert 和 select 类型,它 不会 检查运行时值。
import { text, sqliteTable } from "drizzle-orm/sqlite-core";
const table = sqliteTable('table', {
text: text()
});
// 将推导为 text: "value1" | "value2" | null
text({ enum: ["value1", "value2"] })
text({ mode: 'json' })
text({ mode: 'json' }).$type<{ foo: string }>()CREATE TABLE `table` (
`text` text
);一个数据块,准确地按照输入存储。
建议使用 text('', { mode: 'json' }) 而不是 blob('', { mode: 'json' }),
因为它支持 JSON 函数:
目前所有 JSON 函数在其任何参数为 BLOB 时都会抛出错误, 因为 BLOB 保留用于将来增强功能,其中 BLOB 将存储 JSON 的二进制编码。
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
);您可以为 blob 推导指定 .$type<..>(),它 不会 检查运行时值。
它为默认值、插入和选择模式提供编译时保护。
// 将推导为 { foo: string }
json: blob({ mode: 'json' }).$type<{ foo: string }>();
// 将推导为 string[]
json: blob({ mode: 'json' }).$type<string[]>();
// 不会编译
json: blob({ mode: 'json' }).$type<string[]>().default({});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
);由于 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>(),
});NOT NULL 约束指示关联列不得包含 NULL 值。
const table = sqliteTable('table', {
numInt: integer().notNull()
});CREATE TABLE table (
`numInt` integer NOT NULL
);DEFAULT 子句指定在用户在执行 INSERT
操作时未明确提供值时,使用的默认值。
如果列定义中没有明确的 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_TIME、CURRENT_DATE 或 CURRENT_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(),它们只是同一函数的不同别名,
您可以在运行时生成默认值并在所有插入查询中使用这些值。
这些函数可以帮助您利用各种实现,例如 uuid、cuid、cuid2 等等。
注意:该值不影响 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),
});