Orm 区分knex客户机和knex交易

Orm 区分knex客户机和knex交易,orm,knex.js,Orm,Knex.js,基于Knex promise的事务可以像常规Knex客户端一样使用 const db = knex.transaction() //or just const db = require('knex')(knexOptions) db('books').insert(books); // it works in both case 我需要接受knex对象作为函数的参数,并在其中执行事务。我是否可以区分knex对象或knex事务是否作为参数传递?如果这不是一个事务,我想用knex.trans

基于Knex promise的事务可以像常规Knex客户端一样使用

const db = knex.transaction() //or just const db = require('knex')(knexOptions)
db('books').insert(books);    // it works in both case
我需要接受knex对象作为函数的参数,并在其中执行事务。我是否可以区分knex对象或knex事务是否作为参数传递?如果这不是一个事务,我想用knex.transaction包装客户机对象

我可以使用类似于
db.isTransaction
的语法吗

function myFunc(db) {
if (!db.isTransaction)
  {
    db=knex.transaction()
  }
db('books').insert(books); 
}

虽然没有使用Knex库的本机实现,但是您可以轻松创建一个条件语句来检查连接是否是事务性的

也就是说,您的实现将无法工作,因为
.transaction()
方法不返回数据库实例,而是将实例传递到回调函数:

db.transaction((transactionObject)=>{
交易对象(“账簿”)。插入(账簿);
})
您可以按如下方式调整代码:

函数myFunc(db){
//如果实例不是事务,则创建一个事务
if(db&&!('commit'在db中)和&!('rollback'在db中)){
事务(异步函数(trx){
//对新的事务数据库连接执行查询
等待trx(“账簿”)。插入(账簿);
})
//否则,请在已存在的事务数据库连接上执行该操作
}否则{
db(“账簿”)。插入(账簿);
}
});

这可能是最简单的解决方案,因为它只使用本机JavaScript
in
操作符来检查连接上是否存在仅对事务可用的方法。我不是
knexpert
(不抱歉),但这是我能想到的最干净的方法。

使用
knex.isTransaction
属性来判断对象是knex事务还是客户端

函数myFunction(db){
if(db.isTransaction){
console.log('内部事务')
返回db.from('table_1')。选择()
}否则{
console.log('在事务中包装客户端')
返回db.transaction(trx=>myFunction(trx))
}
}
在这两种情况下,您的查询都应该在事务中执行