Nov 29, 2023
수정 사항
withReplica
기능 사용 시 인자를 올바르게 전달하도록 수정 (#1536 )
selectDistinctOn
이 여러 컬럼과 함께 작동하지 않는 문제 해결 (#1466 )
New Features/Helpers
모든 다이얼렉트의 쿼리 빌더에 대한 상세 JSDoc
이제 여러분은 IDE에서 JSDoc을 사용하며 개발할 때 더 많은 정보, 힌트, 문서 링크 등을 바로 확인할 수 있습니다. 이전에는 필터 표현식에 대해서만 제공되었지만, 이제는 Drizzle 쿼리 빌더의 모든 부분에 대한 JSDoc을 볼 수 있습니다.
SQL 집계 함수를 위한 새로운 헬퍼 함수
집계 함수는 주로 SELECT 문의 GROUP BY 절과 함께 사용됩니다. 따라서 하나의 쿼리에서 집계 함수와 다른 컬럼을 함께 선택할 때는 반드시 .groupBy
절을 사용해야 합니다.
다음은 sql
템플릿을 사용한 함수와 동등한 코드 예제입니다.
count
await db .select ({ value : count () }) .from (users);
await db .select ({ value : count ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `count('*'))` .mapWith (Number)
}) .from (users);
await db .select ({
value : sql `count( ${ users .id } )` .mapWith (Number)
}) .from (users);
countDistinct
await db .select ({ value : countDistinct ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `count( ${ users .id } )` .mapWith (Number)
}) .from (users);
avg
await db .select ({ value : avg ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `avg( ${ users .id } )` .mapWith (String)
}) .from (users);
avgDistinct
await db .select ({ value : avgDistinct ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `avg(distinct ${ users .id } )` .mapWith (String)
}) .from (users);
sum
await db .select ({ value : sum ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `sum( ${ users .id } )` .mapWith (String)
}) .from (users);
sumDistinct
await db .select ({ value : sumDistinct ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `sum(distinct ${ users .id } )` .mapWith (String)
}) .from (users);
max
await db .select ({ value : max ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `max( ${ expression } )` .mapWith ( users .id)
}) .from (users);
min
await db .select ({ value : min ( users .id) }) .from (users);
// 위 코드는 아래와 동일합니다.
await db .select ({
value : sql `min( ${ users .id } )` .mapWith ( users .id)
}) .from (users);
더 많은 정보는 공식 문서를 참고하세요: 집계 헬퍼
New Packages
Drizzle ESLint 플러그인
특정 시나리오에서 타입 검사를 수행할 수 없거나, 가능하더라도 오류 메시지를 이해하기 어려운 경우를 대비해 ESLint 패키지를 만들었습니다. 이 패키지는 개발 과정에서 중요한 시나리오를 다루는 데 도움을 주기 위해 권장 규칙을 제공합니다. 더 자세한 내용은 문서 를 참고하세요.
설치
npm i eslint eslint-plugin-drizzle
yarn add eslint eslint-plugin-drizzle
pnpm add eslint eslint-plugin-drizzle
bun add eslint eslint-plugin-drizzle
타입스크립트 지원을 위해 추가로 다음 패키지를 설치합니다.
npm i @typescript-eslint/eslint-plugin @typescript-eslint/parser
yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser
pnpm add @typescript-eslint/eslint-plugin @typescript-eslint/parser
bun add @typescript-eslint/eslint-plugin @typescript-eslint/parser
사용 방법
.eslintrc.yml
파일을 생성하고, plugins
에 drizzle
을 추가한 후 사용할 규칙을 지정합니다. 아래에서 모든 규칙 목록을 확인할 수 있습니다.
root : true
parser : '@typescript-eslint/parser'
parserOptions :
project : './tsconfig.json'
plugins :
- drizzle
rules :
'drizzle/enforce-delete-with-where' : "error"
'drizzle/enforce-update-with-where' : "error"
전체 설정
이 플러그인은 더 이상 사용되지 않는 규칙을 제외한 모든 규칙을 사용하는 전체 설정을 제공합니다.
root : true
extends :
- "plugin:drizzle/all"
parser : '@typescript-eslint/parser'
parserOptions :
project : './tsconfig.json'
plugins :
- drizzle
현재 all
설정은 recommended
설정과 동일합니다.
root : true
extends :
- "plugin:drizzle/recommended"
parser : '@typescript-eslint/parser'
parserOptions :
project : './tsconfig.json'
plugins :
- drizzle
규칙
enforce-delete-with-where : .delete()
문에서 the.where()
절과 함께 delete
를 사용하도록 강제합니다. 대부분의 경우, 테이블의 모든 행을 삭제할 필요는 없으며, WHERE
절이 필요합니다.
에러 메시지:
`.where(...)` 없이 사용하면 테이블의 모든 행이 삭제됩니다. 원하지 않는 경우 `db.delete(...).where(...)`를 사용하세요. 그렇지 않으면 이 규칙을 무시해도 됩니다.
선택적으로, 플러그인 옵션에서 drizzleObjectName
을 정의할 수 있습니다. 이는 string
또는 string[]
을 받습니다. 이 옵션은 Drizzle이 아닌 객체나 클래스에 delete
메서드가 있을 때 유용합니다. 이러한 delete
메서드는 ESLint 규칙을 트리거할 수 있습니다. 이를 방지하기 위해 코드베이스에서 사용하는 Drizzle 객체의 이름(예: db
)을 정의할 수 있습니다. 이렇게 하면 해당 객체에서 delete
메서드가 호출될 때만 규칙이 트리거됩니다.
예제, 설정 1:
"rules" : {
"drizzle/enforce-delete-with-where" : [ "error" ]
}
class MyClass {
public delete () {
return {}
}
}
const myClassObj = new MyClass ();
// ---> ESLint 규칙에 의해 트리거됨
myClassObj .delete ()
const db = drizzle ( ... )
// ---> ESLint 규칙에 의해 트리거됨
db .delete ()
예제, 설정 2:
"rules" : {
"drizzle/enforce-delete-with-where" : [ "error" , { "drizzleObjectName" : [ "db" ] }] ,
}
class MyClass {
public delete () {
return {}
}
}
const myClassObj = new MyClass ();
// ---> ESLint 규칙에 의해 트리거되지 않음
myClassObj .delete ()
const db = drizzle ( ... )
// ---> ESLint 규칙에 의해 트리거됨
db .delete ()
enforce-update-with-where : .update()
문에서 the.where()
절과 함께 update
를 사용하도록 강제합니다. 대부분의 경우, 테이블의 모든 행을 업데이트할 필요는 없으며, WHERE
절이 필요합니다.
에러 메시지:
`.where(...)` 없이 사용하면 테이블의 모든 행이 업데이트됩니다. 원하지 않는 경우 `db.update(...).set(...).where(...)`를 사용하세요. 그렇지 않으면 이 규칙을 무시해도 됩니다.
선택적으로, 플러그인 옵션에서 drizzleObjectName
을 정의할 수 있습니다. 이는 string
또는 string[]
을 받습니다. 이 옵션은 Drizzle이 아닌 객체나 클래스에 update
메서드가 있을 때 유용합니다. 이러한 update
메서드는 ESLint 규칙을 트리거할 수 있습니다. 이를 방지하기 위해 코드베이스에서 사용하는 Drizzle 객체의 이름(예: db
)을 정의할 수 있습니다. 이렇게 하면 해당 객체에서 update
메서드가 호출될 때만 규칙이 트리거됩니다.
예제, 설정 1:
"rules" : {
"drizzle/enforce-update-with-where" : [ "error" ]
}
class MyClass {
public update () {
return {}
}
}
const myClassObj = new MyClass ();
// ---> ESLint 규칙에 의해 트리거됨
myClassObj .update ()
const db = drizzle ( ... )
// ---> ESLint 규칙에 의해 트리거됨
db .update ()
예제, 설정 2:
"rules" : {
"drizzle/enforce-update-with-where" : [ "error" , { "drizzleObjectName" : [ "db" ] }] ,
}
class MyClass {
public update () {
return {}
}
}
const myClassObj = new MyClass ();
// ---> ESLint 규칙에 의해 트리거되지 않음
myClassObj .update ()
const db = drizzle ( ... )
// ---> ESLint 규칙에 의해 트리거됨
db .update ()