开始使用
概述 PostgreSQL MySQL SQLite 模式管理
概述 列类型 索引和约束 序列 迁移 视图 模式 扩展 访问您的数据
查询 Query 选择 Select 插入 Insert 更新 Update 删除 Delete 筛选器 Filters 连接 Joins sql`` 运算符 性能
查询性能 Serverless 性能 进阶
集合操作 生成列 事务 批量 API 动态查询构建 扩展
Prisma ESLint Plugin drizzle-zod drizzle-typebox drizzle-valibot drizzle-graphql 动态查询构建
默认情况下,由于 Drizzle 中的所有查询构建器都尽可能遵循 SQL 规范,因此大多数方法只能调用一次。
例如,在 SELECT
语句中可能只有一个 WHERE
子句,因此只能调用一次 .where()
:
在以前的 ORM 版本中,当没有实施此类限制时,特别是对于该示例来说,对于许多用户来说,这是一个令人困惑的地方,因为他们期望查询构建器能够将多个 .where()
调用合并为一个条件。
这种行为对于传统的查询构建很有用,即一次创建整个查询。
然而,当你想要动态构建查询时,它会成为一个问题,即如果你有一个共享的函数,它需要一个查询构建器并对其进行增强。
为了解决这个问题,Drizzle 提供了一种特殊的动态模式用于查询构建器,它取消了只能调用方法一次的限制。
要启用它,你需要在查询构建器上调用 .$dynamic()
。
让我们通过实现一个简单的 withPagination
函数来看看它是如何工作的,该函数根据提供的页码和可选的每页大小将 LIMIT
和 OFFSET
子句添加到查询中:
注意,withPagination
函数是泛型的,这允许你在其中修改查询构建器的结果类型,例如通过添加一个连接:
这是可能的,因为 PgSelect
和其他类似类型专门设计用于动态查询构建。它们只能在动态模式下使用。
下面是可以在动态查询构建中用作泛型参数的所有类型列表:
Dialect | Type | |||
Query | Select | Insert | Update | Delete |
Postgres | PgSelect | PgInsert | PgUpdate | PgDelete |
PgSelectQueryBuilder | ||||
MySQL | MySqlSelect | MySqlInsert | MySqlUpdate | MySqlDelete |
MySqlSelectQueryBuilder | ||||
SQLite | SQLiteSelect | SQLiteInsert | SQLiteUpdate | SQLiteDelete |
SQLiteSelectQueryBuilder |
💡
...QueryBuilder
类型是与 独立查询构建器实例 一起使用的。数据库查询构建器是它们的子类,因此你也可以使用它们。