【问题标题】:What's the difference between knex.raw() and knex.schema.raw()?knex.raw() 和 knex.schema.raw() 有什么区别?
【发布时间】:2018-12-11 05:21:24
【问题描述】:

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

看来这两个函数有不同的签名。

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

【问题讨论】:

    标签: knex.js


    【解决方案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'))

    【讨论】:

    • 您的示例不起作用。函数签名为:knex.schema.raw(statement: string): SchemaBuilder; 不支持放置和传递绑定。
    • @slideshowp2 很抱歉证明你错了runkit.com/embed/7spjw0es75y9 它工作得很好。我想 TypeScript 类型只是像许多其他 API 一样缺少该 API。
    猜你喜欢
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    • 2013-08-19
    相关资源
    最近更新 更多