Prisma能否类似MongoDB实现先构建查询、配置完成后再执行?
Prisma 实现按需拼装延迟执行查询的方案
Prisma Client 没有提供和 Mongoose 完全一致的「链式调用查询对象、最终调用exec()触发执行」的原生API,但可以非常方便地实现完全同等的效果,不存在提前触发数据库查询的问题。
Prisma 所有查询方法都是接收一个配置对象作为入参,只有实际调用模型上的CRUD方法时才会发起数据库请求,因此你完全可以先维护一个普通的配置对象,按需追加所有查询参数,等配置完成后再传入查询方法执行即可,等价于Mongoose链式调用+exec的能力。
对应业务场景的实现示例
针对find方法需要支持limit、select、sort、skip四个可选参数的需求,等价实现代码如下:
// 初始化基础查询配置,where字段对应传入的基础查询条件 const queryConfig = { where: baseQueryFilter } // 按需追加可选查询参数 if (limit) { // Prisma 用 take 字段实现 limit 语义,控制返回结果条数 queryConfig.take = limit } if (skip) { queryConfig.skip = skip } if (sort) { // Prisma 排序字段为 orderBy,格式示例:{ createTime: 'desc' } queryConfig.orderBy = sort } if (select) { // Prisma 字段选择参数名同样为 select,格式示例:{ id: true, userName: true } queryConfig.select = select } // 所有参数拼装完成后才实际执行查询,和 Mongoose 调用 exec() 的触发时机完全一致 const result = await prisma.yourModelName.findMany(queryConfig)
补充说明
- 参数名差异:Prisma 中对应Mongoose
limit的参数是take,对应sort的参数是orderBy,skip和select的参数名和Mongoose一致 - 如果你偏好链式调用的代码风格,完全可以自行封装一个轻量查询构造类,对外暴露
limit()、skip()、sort()、select()的链式方法,内部维护上述queryConfig对象,最后提供一个exec()方法调用Prisma的findMany即可,实现成本极低 - 整个参数拼装过程都是普通JS对象的操作,不会产生任何数据库IO,只有最终调用findMany的瞬间才会连接数据库执行查询,完全满足延迟执行的要求
内容的提问来源于stack exchange,提问作者Valeri
相关产品推荐
相关产品推荐

