knex 查询生成器和链中调用方法的顺序

knex query builder and the order of methods called in a chain

阅读 knex documentation and knex cheat sheet,我发现在提供的示例中 .where() 总是在 table 引用之后立即调用:

knex('users')
  .where({ id: 2 })
  .update({ name: 'Homer' })
// UPDATE `users` SET `name`='Homer` WHERE `id`=2 

上面的代码看起来合乎逻辑,因为完整的数据集在 运行 .update().

之前被缩小了

令我困惑的是交换方法会产生相同的 SQL 查询:

knex('users')
  .update({ name: 'Homer' }) 
  .where({ id: 2 })
// UPDATE `users` SET `name`='Homer` WHERE `id`=2 

新手可能会直觉地期望 WHEREUPDATE 之后应用,类似于 javascript 数组方法。

尝试其他示例,如 knex.select().table('books'),通过实验,我发现 查询构建器只是 "collects" knex 和 [=18= 之间的所有方法](或语句末尾),并将它们组合成一个 单个 查询,然后运行它

如果有人通过 link 对文档或其他 knex 资源确认上述声明,我将非常满意。

通常查询构建器会收集所有已调用的构建器方法,调用它们的顺序无关紧要。这是因为生成的 SQL 无法按任何其他顺序生成。

但是有一些方法,调用它们的顺序实际上很重要。最值得注意的是 .clearSelect.clearWhere.clearOrder 方法 http://knexjs.org/#Builder-clear

此外,当多个列在单个语句中更新时,更新顺序实际上反映了 SET 语句输出的顺序。

可能还有一些其他的微妙之处,其中顺序很重要,但我不相信有人曾经追踪过所有这些细节。