knex-链接语句

问题描述

我很好奇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()语句中都调用数据库

我找不到任何有关如何实际调用/查询数据库的文档。

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

感谢一堆!

解决方法

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

  1. 这取决于您的需要,事务不是查询聚合器,而是一种机制,使您可以使用多个查询来查询数据库,这将确保它们将作为一个查询运行。 例如,当您需要在几张表中进行几处更改时,如果其中之一失败,则无济于事执行其他表。 经典示例是银行应用程序,您应该从一个用户那里取钱,然后将其添加到其他用户。 如果第一个操作(收款)成功,但是第二个操作失败,则您的系统处于未知状态。 为防止这种情况,请在事务中运行它们,如果发生任何故障,数据库将回滚该操作。

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

  1. Knex是一个查询生成器,它紧跟Builder design pattern之后,这意味着所有方法都在其中“累积”,一旦调用then方法,它就会生成查询并将其传递给D B。 您可以对其进行测试,构建一个select查询,而不必调用“ then”,它将不会在数据库上执行任何查询。