DrizzleORM v0.29.1 发布
Nov 29, 2023

修复

  • 使用 withReplica 功能时正确转发参数(#1536
  • 修复 selectDistinctOn 与多个列不兼容的问题(#1466

新特性/辅助工具

所有方言的查询构建器的详细 JSDoc

现在,您可以在开发和使用 JSDoc 时访问更多信息、提示、文档链接等。之前,我们只为过滤表达式提供了这些信息,但现在您可以在 Drizzle 查询构建器的所有部分中看到它们。

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

要查找更多信息,请查看文档:聚合函数辅助工具

新包

Drizzle ESLint 插件

对于无法对特定场景执行类型检查的情况,或者无法理解错误消息的复杂情况,我们决定创建一个带有推荐规则的 ESLint 包。该插件旨在帮助开发人员处理开发过程中的关键场景。更多信息请参见文档

安装

npm
yarn
pnpm
bun
npm i eslint eslint-plugin-drizzle

您可以在 IDE 中安装这些包以获得 TypeScript 支持

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

用法

创建一个.eslintrc.yml文件,将drizzle添加到plugins中,并指定要使用的规则。下面是所有现有规则的列表

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"

所有配置

该插件导出了一个包含所有规则的 all 配置(不包括已弃用的规则)。

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,接受stringstring[]。当您有对象或类具有不是来自 Drizzle 的 delete 方法时,此选项非常有用。这样的 delete 方法将触发 ESLint 规则。为了避免这种情况,您可以定义在代码库中使用的 Drizzle 对象的名称(如 db),这样规则仅在删除方法来自该对象时才会触发:

示例配置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,接受stringstring[]。当您有对象或类具有不是来自 Drizzle 的 update 方法时,此选项非常有用。这样的 update 方法将触发 ESLint 规则。为了避免这种情况,您可以定义在代码库中使用的 Drizzle 对象的名称(如 db),这样规则仅在更新方法来自该对象时才会触发:

示例配置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()
Become a Gold Sponsor