DrizzleORM v0.28.6 릴리스
Sep 6, 2023

변경 사항

참고: MySQL datetime에서 mode: 'date'를 사용할 경우, 이제 날짜를 UTC 문자열로 저장하고 데이터도 UTC로 가져옵니다. 이는 MySQL의 datetime 동작과 일치하도록 조정된 것입니다. 다른 동작이 필요하거나 datetime 매핑을 다르게 처리하려면 mode: 'string'을 사용하거나 커스텀 타입 구현을 참고하세요.

구현 세부 사항은 MySQL 날짜/시간 매핑 수정을 확인하세요.

New Features

🎉 LibSQL 배치 API 지원

참고: https://docs.turso.tech/reference/client-access/javascript-typescript-sdk#execute-a-batch-of-statements

배치 API 사용 예제:

const batchResponse = await db.batch([
    db.insert(usersTable).values({ id: 1, name: 'John' }).returning({
        id: usersTable.id,
    }),
    db.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),
    db.query.usersTable.findMany({}),
    db.select().from(usersTable).where(eq(usersTable.id, 1)),
    db.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(
        usersTable,
    ),
]);
type BatchResponse = [
    {
        id: number;
    }[],
    ResultSet,
    {
        id: number;
        name: string;
        verified: number;
        invitedBy: number | null;
    }[],
    {
        id: number;
        name: string;
        verified: number;
        invitedBy: number | null;
    }[],
    {
        id: number;
        invitedBy: number | null;
    }[],
];

db.batch 내부에서 사용할 수 있는 모든 빌더:

`db.all()`,
`db.get()`,
`db.values()`,
`db.run()`,
`db.query..findMany()`,
`db.query..findFirst()`,
`db.select()...`,
`db.update()...`,
`db.delete()...`,
`db.insert()...`,

더 많은 사용 예제는 여기에서 확인할 수 있습니다: integration-tests/tests/libsql-batch.test.ts문서

🎉 SQLite에서 JSON 모드로 텍스트 추가하기

자세한 내용은 문서에서 확인할 수 있습니다.

const test = sqliteTable('test', {
    dataTyped: text('data_typed', { mode: 'json' }).$type().notNull(),
});

위 코드는 SQLite 테이블을 생성할 때, data_typed 컬럼을 JSON 모드로 설정하는 예제입니다. 이렇게 하면 해당 컬럼에 JSON 형식의 데이터를 저장할 수 있습니다.

🎉 관계형 쿼리 API 호출에 .toSQL() 추가하기

const query = db.query.usersTable.findFirst().toSQL();

위 코드는 usersTable에서 첫 번째 레코드를 찾는 쿼리를 SQL 문으로 변환합니다. .toSQL() 메서드를 사용하면 실제로 실행되는 SQL 쿼리를 확인할 수 있습니다. 이 기능은 디버깅이나 쿼리 최적화에 유용하게 활용할 수 있습니다.

🎉 새로운 PostgreSQL 배열 연산자 추가

새로 추가된 연산자와 사용 예제를 확인해 보세요.
arrayContains, arrayContained, arrayOverlaps

자세한 내용은 문서에서 확인할 수 있습니다.

// 배열이 특정 값을 포함하는지 확인
const contains = await db.select({ id: posts.id }).from(posts)
    .where(arrayContains(posts.tags, ['Typescript', 'ORM']));

// 배열이 특정 값에 포함되는지 확인
const contained = await db.select({ id: posts.id }).from(posts)
    .where(arrayContained(posts.tags, ['Typescript', 'ORM']));

// 배열이 특정 값과 겹치는지 확인
const overlaps = await db.select({ id: posts.id }).from(posts)
    .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));

// 서브쿼리를 사용하여 배열이 특정 값을 포함하는지 확인
const withSubQuery = await db.select({ id: posts.id }).from(posts)
    .where(arrayContains(
        posts.tags,
        db.select({ tags: posts.tags }).from(posts).where(eq(posts.id, 1)),
    ));

🎉 Relational Queries의 where 필터 함수에 더 많은 SQL 연산자 추가

더 많은 예제는 문서에서 확인할 수 있습니다.

// 이전
import { inArray } from "drizzle-orm/pg-core";

await db.users.findFirst({
  where: (table, _) => inArray(table.id, [ ... ])
})
// 이후
await db.users.findFirst({
  where: (table, { inArray }) => inArray(table.id, [ ... ])
})

수정 사항