knex - 链接语句
knex - chaining statements
我很好奇 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 什么时候真正查询数据库?只有在所有承诺都得到解决后才会发生吗?还是在每个
knex()
语句中调用数据库?
我找不到任何关于它实际上如何 calls/queries 数据库的文档。
乍一看,似乎每个 knex()
语句都会调用数据库(在我的示例中,这将是三个不同的时间?)这意味着创建一个事务比所有这些都要好 1000%小 queries/calls
非常感谢!
很好的问题,这里有一些答案:
- 这取决于您的需要,事务不是查询聚合器,而是一种允许您使用多个查询查询数据库的机制,这将保证它们 运行 作为一个。
例如,当您需要在多个表中进行多项更改时,如果其中一个失败,则执行其他表就没有意义了。
典型的例子是银行应用程序,您应该从一个用户那里取钱并将其添加到其他用户那里。
如果第一个动作(拿钱)成功但第二个动作失败,则您的系统处于未知状态。
为防止这种情况,您 运行 他们在交易中,如果任何事情失败,数据库将回滚操作。
小技巧,使用async/await
语法,它会让你的代码更具可读性。
- Knex 是一个查询构建器,它遵循 Builder design pattern,这意味着所有方法都在其中“累积”,一旦您调用
then
方法,它就会构建查询并传递它到数据库。
您可以对其进行测试,构建一个 select
查询并且不要调用“then”,它不会在数据库上执行任何查询。
我很好奇 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 什么时候真正查询数据库?只有在所有承诺都得到解决后才会发生吗?还是在每个
knex()
语句中调用数据库?
我找不到任何关于它实际上如何 calls/queries 数据库的文档。
乍一看,似乎每个 knex()
语句都会调用数据库(在我的示例中,这将是三个不同的时间?)这意味着创建一个事务比所有这些都要好 1000%小 queries/calls
非常感谢!
很好的问题,这里有一些答案:
- 这取决于您的需要,事务不是查询聚合器,而是一种允许您使用多个查询查询数据库的机制,这将保证它们 运行 作为一个。 例如,当您需要在多个表中进行多项更改时,如果其中一个失败,则执行其他表就没有意义了。 典型的例子是银行应用程序,您应该从一个用户那里取钱并将其添加到其他用户那里。 如果第一个动作(拿钱)成功但第二个动作失败,则您的系统处于未知状态。 为防止这种情况,您 运行 他们在交易中,如果任何事情失败,数据库将回滚操作。
小技巧,使用async/await
语法,它会让你的代码更具可读性。
- Knex 是一个查询构建器,它遵循 Builder design pattern,这意味着所有方法都在其中“累积”,一旦您调用
then
方法,它就会构建查询并传递它到数据库。 您可以对其进行测试,构建一个select
查询并且不要调用“then”,它不会在数据库上执行任何查询。