如何在Node.js的Bookshelf/Knex单次查询中添加WITH(NO LOCK)?
在Bookshelf查询中单独添加WITH(NO LOCK)(基于Knex实现)
因为Bookshelf底层依赖Knex,你可以通过干预Knex查询构建器的方式,仅在当前API调用中添加WITH(NOLOCK)条件,不会影响模型的其他使用场景。
修改后的查询代码
User.forge() .query(qb => { // 给User表添加WITH(NOLOCK),两种方式二选一 // 方式1:直接拼接SQL片段(兼容所有支持NOLOCK的数据库) qb.from('users WITH(NOLOCK)'); // 方式2:使用Knex内置的noLock方法(针对SQL Server,需确认Knex版本支持) // qb.noLock(); }) .fetchAll({ withRelated: [{ role: qb => { // 若关联的role表也需要NOLOCK,同样处理 qb.from('roles WITH(NOLOCK)'); // qb.noLock(); } }] }) .then(function(result) { res.json({ data: result ? result.toJSON() : [] }); }) .catch(err => { res.json({ error: err.message }); });
关键说明
.query()方法的作用:该方法允许你直接操作底层的Knex查询构建器,自定义当前查询的SQL逻辑,仅对本次查询生效,不会修改模型的全局配置。- 关联表的处理:如果关联的
role表也需要添加NOLOCK,在withRelated数组中对关联项传入查询构建器函数,重复上述操作即可。 - 为什么
User.forge('WITH(NO LOCK)')无效:forge()方法用于初始化模型实例,参数是模型的属性数据,并非查询语句,所以无法通过这种方式添加锁条件。
内容的提问来源于stack exchange,提问作者app
相关产品推荐
相关产品推荐

