问题描述
我很好奇knex
的工作原理,因为sql
看起来很流畅,而结构却更加结构化。最终knex
会转换为sql
或任何数据库引擎。
问题
-
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中创建交易?
乍看之下,似乎每个knex()
语句都将调用数据库(在我的示例中,这将是三个不同的时间?),这意味着创建事务比所有这些小查询都要好1000% /通话
感谢一堆!
解决方法
很好的问题,这里有一些答案:
- 这取决于您的需要,事务不是查询聚合器,而是一种机制,使您可以使用多个查询来查询数据库,这将确保它们将作为一个查询运行。 例如,当您需要在几张表中进行几处更改时,如果其中之一失败,则无济于事执行其他表。 经典示例是银行应用程序,您应该从一个用户那里取钱,然后将其添加到其他用户。 如果第一个操作(收款)成功,但是第二个操作失败,则您的系统处于未知状态。 为防止这种情况,请在事务中运行它们,如果发生任何故障,数据库将回滚该操作。
小技巧,使用async/await
语法,它将使您的代码更具可读性。
- Knex是一个查询生成器,它紧跟Builder design pattern之后,这意味着所有方法都在其中“累积”,一旦调用
then
方法,它就会生成查询并将其传递给D B。 您可以对其进行测试,构建一个select
查询,而不必调用“ then”,它将不会在数据库上执行任何查询。