Drizzle | 기본값으로 빈 배열 설정하기
This guide assumes familiarity with:

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
);

위 예제에서는 tags1tags2 컬럼에 기본값으로 빈 배열을 설정했습니다. sql 연산자를 사용하여 '{}'::text[] 또는 ARRAY[]::text[] 구문으로 빈 배열을 지정할 수 있습니다. 이렇게 하면 새로운 레코드를 추가할 때 해당 컬럼에 기본적으로 빈 배열이 할당됩니다.

MySQL

MySQL은 배열(array) 데이터 타입을 제공하지 않지만, 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().notNull().default([]),
  tags2: json('tags2')
    .$type()
    .notNull()
    .default(sql`('[]')`), // default([])와 동일
  tags3: json('tags3')
    .$type()
    .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 객체 리터럴로 처리됩니다.

.$type<..>()을 사용해 JSON 객체 추론을 지정할 수 있습니다. 이는 런타임 값을 검사하지 않으며, 기본값, 삽입 및 선택 스키마에 대한 컴파일 타임 보호를 제공합니다.

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()
    .default(sql`(json_array())`),
  tags2: text('tags2', { mode: 'json' })
    .notNull()
    .$type()
    .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 객체 리터럴로 처리됩니다.

.$type<..>()를 사용하여 JSON 객체 추론을 지정할 수 있습니다. 이는 런타임 값을 검사하지 않으며, 기본값, 삽입 및 선택 스키마에 대한 컴파일 타임 보호를 제공합니다.