Drizzle | 空数组作为默认值
本指南假定您熟悉

PostgreSQL

要在 PostgreSQL 中设置空数组作为默认值,可以使用 sql 操作符配合 '{}'ARRAY[] 语法。

import { sql } from 'drizzle-orm';
import { pgTable, serial, text } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  tags1: text('tags1')
    .array()
    .notNull()
    .default(sql`'{}'::text[]`),
  tags2: text('tags2')
    .array()
    .notNull()
    .default(sql`ARRAY[]::text[]`),
});
CREATE TABLE IF NOT EXISTS "users" (
	"id" serial PRIMARY KEY NOT NULL,
	"name" text NOT NULL,
	"tags1" text[] DEFAULT '{}'::text[] NOT NULL,
	"tags2" text[] DEFAULT ARRAY[]::text[] NOT NULL
);

MySQL

MySQL 没有数组数据类型,但你可以使用 json 数据类型实现相同的目的。要在 MySQL 中设置空数组作为默认值,可以使用 JSON_ARRAY() 函数或 sql 操作符配合 ('[]') 语法。

import { sql } from 'drizzle-orm';
import { json, mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core';

export const users = mysqlTable('users', {
  id: serial('id').primaryKey(),
  name: varchar('name', { length: 255 }).notNull(),
  tags1: json('tags1').$type<string[]>().notNull().default([]),
  tags2: json('tags2')
    .$type<string[]>()
    .notNull()
    .default(sql`('[]')`), // the same as default([])
  tags3: json('tags3')
    .$type<string[]>()
    .notNull()
    .default(sql`(JSON_ARRAY())`),
});
CREATE TABLE `users` (
	`id` serial AUTO_INCREMENT NOT NULL,
	`name` varchar(255) NOT NULL,
	`tags1` json NOT NULL DEFAULT ('[]'),
	`tags2` json NOT NULL DEFAULT ('[]'),
	`tags3` json NOT NULL DEFAULT (JSON_ARRAY()),
	CONSTRAINT `users_id` PRIMARY KEY(`id`)
);

mode 选项定义了值在应用程序中的处理方式。在 json 模式下,值被视为 JSON 对象字面量。

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

SQLite

SQLite 没有数组数据类型,但你可以使用 text 数据类型实现相同的目的。要在 SQLite 中设置空数组作为默认值,可以使用 json_array() 函数或 sql 操作符配合 '[]' 语法。

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

export const users = sqliteTable('users', {
  id: integer('id').primaryKey(),
  tags1: text('tags1', { mode: 'json' })
    .notNull()
    .$type<string[]>()
    .default(sql`(json_array())`),
  tags2: text('tags2', { mode: 'json' })
    .notNull()
    .$type<string[]>()
    .default(sql`'[]'`),
});
CREATE TABLE `users` (
	`id` integer PRIMARY KEY NOT NULL,
	`tags1` text DEFAULT (json_array()) NOT NULL,
	`tags2` text DEFAULT '[]' NOT NULL
);

mode 选项定义了值在应用程序中的处理方式。在 json 模式下,值被视为 JSON 对象字面量。

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