knex.raw()和knex.schema.raw()有什么区别?

时间:2018-12-11 05:21:24

标签: knex.js

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

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

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

1 个答案:

答案 0 :(得分:1)

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

knex.schema.*的工作方式略有不同。 Knex架构方法创建查询数组,然后在解析架构生成器时一个接一个地执行查询。

例如,如果您执行knex.schema.createTable(t => ...).raw('DROP ALL').toSQL(),将会看到生成了多个查询,并且所有这些查询都将在触发模式生成器时执行。

如果仅执行await knex.schema.raw('SELECT 1')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也不会返回QueryBuilder,但是会返回SchemaBuilder,并提供不同的方法。

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