knex - 链接语句

knex - chaining statements

我很好奇 knex 是如何工作的,因为它看起来很流畅,而 sql 则更有条理。最终 knex 转换为 sql 或任何数据库引擎。

问题

  1. 是否更好地链接方法以不断解决承诺? 例如:

    knex('table').select('wire').limit(1).then((row)=>{
     if(row){
       knex('table2').update()... (1)
     }
     throw new Error('Nothing')
    }).then(r=>{
       knex('tablw')..... (2)
    })
    ....
    catch(e=>{
       ....
    })
    

或在 knex 中创建交易?

  1. knex 什么时候真正查询数据库?只有在所有承诺都得到解决后才会发生吗?还是在每个 knex() 语句中调用数据库?

我找不到任何关于它实际上如何 calls/queries 数据库的文档。

乍一看,似乎每个 knex() 语句都会调用数据库(在我的示例中,这将是三个不同的时间?)这意味着创建一个事务比所有这些都要好 1000%小 queries/calls

非常感谢!

很好的问题,这里有一些答案:

  1. 这取决于您的需要,事务不是查询聚合器,而是一种允许您使用多个查询查询数据库的机制,这将保证它们 运行 作为一个。 例如,当您需要在多个表中进行多项更改时,如果其中一个失败,则执行其他表就没有意义了。 典型的例子是银行应用程序,您应该从一个用户那里取钱并将其添加到其他用户那里。 如果第一个动作(拿钱)成功但第二个动作失败,则您的系统处于未知状态。 为防止这种情况,您 运行 他们在交易中,如果任何事情失败,数据库将回滚操作。

小技巧,使用async/await语法,它会让你的代码更具可读性。

  1. Knex 是一个查询构建器,它遵循 Builder design pattern,这意味着所有方法都在其中“累积”,一旦您调用 then 方法,它就会构建查询并传递它到数据库。 您可以对其进行测试,构建一个 select 查询并且不要调用“then”,它不会在数据库上执行任何查询。