knex.raw(sql, bindings)
和knex.schema.raw(statement)
。
这两个函数似乎具有不同的签名。
如果它们等效,我如何使用knex.schema.raw(statement)
并将bindings
传递给它?
答案 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'))