首页 > 解决方案 > knex.raw() 和 knex.schema.raw() 有什么区别?

问题描述

knex.raw(sql, bindings)knex.schema.raw(statement)

这两个函数似乎有不同的签名。

如果它们是等效的,我该如何使用knex.schema.raw(statement)并传递bindings给它?

标签: knex.js

解决方案


knex.raw创建可以立即执行的查询构建器实例。

事情的工作方式knex.schema.*有点不同。Knex 模式方法创建一个查询数组,然后在解析模式构建器时一个一个地执行。

因此,例如,如果您这样做,knex.schema.createTable(t => ...).raw('DROP ALL').toSQL()您将看到生成了多个查询,并且它们都将在触发架构构建器时执行。

如果你只做await knex.schema.raw('SELECT 1')or await knex.raw('SELECT 1'),就不会有任何差异。但knex.schema.raw你也可以这样做:

await knex.schema.raw('SELECT 1').raw('SELECT 2');

它返回一个数组,其中找到了两个查询的结果。因此,完全有可能利用该功能来一个接一个地运行多个查询,如下所示:

await knex.schema
  .raw('?', [knex('table1').where('id', 1)])
  .raw('?', [knex('table2').where('id', 2)]);

knex.schema.raw不会 return QueryBuilder,但它会返回SchemaBuilder不同的可用方法。

因此knex.schema.raw不能用作正常查询的一部分,例如knex('table').where(knex.raw('id = 1'))


推荐阅读