DrizzleORM v0.29.1 릴리스
Nov 29, 2023

수정 사항

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
yarn
pnpm
bun
npm i eslint eslint-plugin-drizzle

타입스크립트 지원을 위해 추가로 다음 패키지를 설치합니다.

npm
yarn
pnpm
bun
npm i @typescript-eslint/eslint-plugin @typescript-eslint/parser

사용 방법

.eslintrc.yml 파일을 생성하고, pluginsdrizzle을 추가한 후 사용할 규칙을 지정합니다. 아래에서 모든 규칙 목록을 확인할 수 있습니다.

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()