Drizzle | SQL 타임스탬프를 기본값으로 설정하기
This guide assumes familiarity with:

PostgreSQL

PostgreSQL에서 현재 타임스탬프를 기본값으로 설정하려면 defaultNow() 메서드나 sql 연산자와 now() 함수를 사용할 수 있습니다. now() 함수는 현재 날짜와 시간을 타임존과 함께 반환합니다.

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

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  timestamp1: timestamp('timestamp1').notNull().defaultNow(),
  timestamp2: timestamp('timestamp2', { mode: 'string' })
    .notNull()
    .default(sql`now()`),
});
CREATE TABLE IF NOT EXISTS "users" (
	"id" serial PRIMARY KEY NOT NULL,
	"timestamp1" timestamp DEFAULT now() NOT NULL,
	"timestamp2" timestamp DEFAULT now() NOT NULL
);

mode 옵션은 애플리케이션에서 값을 어떻게 처리할지 정의합니다. string 모드로 설정된 값은 애플리케이션에서는 문자열로 처리되지만, 데이터베이스에는 타임스탬프로 저장됩니다.

// 데이터베이스에 저장된 데이터
+----+----------------------------+----------------------------+
| id |         timestamp1         |         timestamp2         |
+----+----------------------------+----------------------------+
| 1  | 2024-04-11 14:14:28.038697 | 2024-04-11 14:14:28.038697 |
+----+----------------------------+----------------------------+
// 애플리케이션에서 반환된 데이터
[
  {
    id: 1,
    timestamp1: 2024-04-11T14:14:28.038Z, // Date 객체
    timestamp2: '2024-04-11 14:14:28.038697' // 문자열
  }
]

Unix 타임스탬프를 기본값으로 설정하려면 sql 연산자와 extract(epoch from now()) 함수를 사용할 수 있습니다. 이 함수는 1970-01-01 00:00:00 UTC부터 현재까지의 초 단위 시간을 반환합니다.

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

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  timestamp: integer('timestamp')
    .notNull()
    .default(sql`extract(epoch from now())`),
});
CREATE TABLE IF NOT EXISTS "users" (
	"id" serial PRIMARY KEY NOT NULL,
	"timestamp" integer DEFAULT extract(epoch from now()) NOT NULL
);
// 데이터베이스에 저장된 데이터
+----+------------+
| id | timestamp  |
+----+------------+
|  1 | 1712846784 |
+----+------------+
// 애플리케이션에서 반환된 데이터
[ 
  { 
    id: 1, 
    timestamp: 1712846784 // 숫자
  } 
]

MySQL

MySQL에서 현재 시간을 기본값으로 설정하려면 defaultNow() 메서드나 now() 함수와 함께 sql 연산자를 사용할 수 있습니다. now() 함수는 현재 날짜와 시간을 (YYYY-MM-DD HH-MM-SS) 형식으로 반환합니다.

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

export const users = mysqlTable('users', {
  id: serial('id').primaryKey(),
  timestamp1: timestamp('timestamp1').notNull().defaultNow(),
  timestamp2: timestamp('timestamp2', { mode: 'string' })
    .notNull()
    .default(sql`now()`),
  timestamp3: timestamp('timestamp3', { fsp: 3 }) // 초 단위 소수 부분
    .notNull()
    .default(sql`now(3)`),
});
CREATE TABLE `users` (
	`id` serial AUTO_INCREMENT NOT NULL,
	`timestamp1` timestamp NOT NULL DEFAULT now(),
	`timestamp2` timestamp NOT NULL DEFAULT now(),
	`timestamp3` timestamp(3) NOT NULL DEFAULT now(3),
	CONSTRAINT `users_id` PRIMARY KEY(`id`)
);

fsp 옵션은 타임스탬프에 포함될 초 단위 소수 부분의 자릿수를 정의합니다. 기본값은 0입니다.
mode 옵션은 애플리케이션에서 값을 어떻게 처리할지 정의합니다. string 모드로 설정된 값은 애플리케이션에서는 문자열로 처리되지만, 데이터베이스에는 타임스탬프로 저장됩니다.

// 데이터베이스에 저장된 데이터
+----+---------------------+---------------------+-------------------------+
| id | timestamp1          | timestamp2          | timestamp3              |
+----+---------------------+---------------------+-------------------------+
|  1 | 2024-04-11 15:24:53 | 2024-04-11 15:24:53 | 2024-04-11 15:24:53.236 |
+----+---------------------+---------------------+-------------------------+
// 애플리케이션에서 반환된 데이터
[
  {
    id: 1,
    timestamp1: 2024-04-11T15:24:53.000Z, // Date 객체
    timestamp2: '2024-04-11 15:24:53', // 문자열
    timestamp3: 2024-04-11T15:24:53.236Z // Date 객체
  }
]

유닉스 타임스탬프를 기본값으로 설정하려면 sql 연산자와 unix_timestamp() 함수를 사용할 수 있습니다. 이 함수는 1970-01-01 00:00:00 UTC부터 현재까지의 초 단위 시간을 반환합니다.

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

export const users = mysqlTable('users', {
  id: serial('id').primaryKey(),
  timestamp: int('timestamp')
    .notNull()
    .default(sql`(unix_timestamp())`),
});
CREATE TABLE `users` (
	`id` serial AUTO_INCREMENT NOT NULL,
	`timestamp` int NOT NULL DEFAULT (unix_timestamp()),
	CONSTRAINT `users_id` PRIMARY KEY(`id`)
);
// 데이터베이스에 저장된 데이터
+----+------------+
| id | timestamp  |
+----+------------+
|  1 | 1712847986 |
+----+------------+
// 애플리케이션에서 반환된 데이터
[ 
  { 
    id: 1, 
    timestamp: 1712847986 // 숫자
  } 
]

SQLite

SQLite에서 현재 시간을 기본값으로 설정하려면 sql 연산자와 current_timestamp 상수를 사용할 수 있습니다. 이 상수는 현재 UTC 날짜와 시간을 텍스트 형식(YYYY-MM-DD HH:MM:SS)으로 반환합니다.

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

export const users = sqliteTable('users', {
  id: integer('id').primaryKey(),
  timestamp: text('timestamp')
    .notNull()
    .default(sql`(current_timestamp)`),
});
CREATE TABLE `users` (
	`id` integer PRIMARY KEY NOT NULL,
	`timestamp` text DEFAULT (current_timestamp) NOT NULL
);
// 데이터베이스에 저장된 데이터
+----+---------------------+
| id | timestamp           |
+----+---------------------+
|  1 | 2024-04-11 15:40:43 |
+----+---------------------+
// 애플리케이션에서 반환된 데이터
[
  {
    id: 1,
    timestamp: '2024-04-11 15:40:43' // 문자열
  }
]

SQLite에서 유닉스 타임스탬프를 기본값으로 설정하려면 sql 연산자와 unixepoch() 함수를 사용할 수 있습니다. 이 함수는 1970-01-01 00:00:00 UTC부터 현재까지의 초 단위 시간을 반환합니다.

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

export const users = sqliteTable('users', {
  id: integer('id').primaryKey(),
  timestamp1: integer('timestamp1', { mode: 'timestamp' })
    .notNull()
    .default(sql`(unixepoch())`),
  timestamp2: integer('timestamp2', { mode: 'timestamp_ms' })
    .notNull()
    .default(sql`(unixepoch() * 1000)`),
  timestamp3: integer('timestamp3', { mode: 'number' })
    .notNull()
    .default(sql`(unixepoch())`),
});
CREATE TABLE `users` (
	`id` integer PRIMARY KEY NOT NULL,
	`timestamp1` integer DEFAULT (unixepoch()) NOT NULL,
	`timestamp2` integer DEFAULT (unixepoch() * 1000) NOT NULL,
	`timestamp3` integer DEFAULT (unixepoch()) NOT NULL
);

mode 옵션은 애플리케이션에서 값을 어떻게 처리할지 정의합니다. 애플리케이션에서는 timestamptimestamp_ms 모드의 값이 Date 객체로 처리되지만, 데이터베이스에는 정수로 저장됩니다. 차이점은 timestamp는 초 단위를 처리하고, timestamp_ms는 밀리초 단위를 처리한다는 점입니다.

// 데이터베이스에 저장된 데이터
+------------+------------+---------------+------------+
| id         | timestamp1 | timestamp2    | timestamp3 |
+------------+------------+---------------+------------+
| 1          | 1712835640 | 1712835640000 | 1712835640 |
+------------+------------+---------------+------------+
// 애플리케이션에서 반환된 데이터
[
  {
    id: 1,
    timestamp1: 2024-04-11T11:40:40.000Z, // Date 객체
    timestamp2: 2024-04-11T11:40:40.000Z, // Date 객체
    timestamp3: 1712835640 // 숫자
  }
]