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 , [ ... ])
})
수정 사항
SQLite에서 on conflict
구문의 위치 수정 (#1076 )
libsql/client 타입 import 문제 해결 (#1122 )
RDS에서 raw SQL 쿼리가 제대로 매핑되지 않는 문제 수정 (#1071 )
MySQL에서 Datetime 매핑 문제 해결 (#1082 )
smallserial이 serial로 생성되는 문제 수정 (#1127 )