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 - 11 T14 : 14 :28.038 Z , // 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 - 11 T15 : 24 :53.000 Z , // Date 객체
timestamp2 : '2024-04-11 15:24:53' , // 문자열
timestamp3 : 2024 - 04 - 11 T15 : 24 :53.236 Z // 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
옵션은 애플리케이션에서 값을 어떻게 처리할지 정의합니다. 애플리케이션에서는 timestamp
와 timestamp_ms
모드의 값이 Date
객체로 처리되지만, 데이터베이스에는 정수로 저장됩니다. 차이점은 timestamp
는 초 단위를 처리하고, timestamp_ms
는 밀리초 단위를 처리한다는 점입니다.
// 데이터베이스에 저장된 데이터
+------------+------------+---------------+------------+
| id | timestamp1 | timestamp2 | timestamp3 |
+------------+------------+---------------+------------+
| 1 | 1712835640 | 1712835640000 | 1712835640 |
+------------+------------+---------------+------------+
// 애플리케이션에서 반환된 데이터
[
{
id : 1 ,
timestamp1 : 2024 - 04 - 11 T11 : 40 :40.000 Z , // Date 객체
timestamp2 : 2024 - 04 - 11 T11 : 40 :40.000 Z , // Date 객체
timestamp3 : 1712835640 // 숫자
}
]