Pg-promise - 可能参与 transaction/task 的可重用查询
Pg-promise - Reusable queries that may participate in a transaction/task
我正在尝试实现一种重用模式,其中查询函数 可能 接收参数 trx=tx/task 如果它们参与现有的 transaction/task,并重用 tx/task 上下文...否则,如果 trx=undefined 传入,则为查询创建一个新任务。这个想法是让函数不知道它是被单独使用,还是正在参与高阶块交易。
我想要的(理想情况下)是一个 promise 函数,它将 return 一个任务上下文,这样我就可以像下面这样干净地编写(这是行不通的):
async function trxRunQueries(trx:ITask<any>|undefined = undefined):Promise<any[]>
{
if(!trx)
trx=await db.task(); // if !trx then create new task context from db
const dataset1 = await trx.many(`select * from tableA`);
const dataset2 = await trx.many(`select * from tableB`);
return [dataset1,dataset2];
}
然而,似乎 db.task() 需要在 cb 参数中执行上下文查询,但这让我很困惑,想知道如何在不将代码写出两次的情况下实现所需的模式——一次是db.task(trx => ) 包装器,另一个直接执行 trx.many(...)。
我想知道是否可以做一些骇人听闻的事情,如下所示,以实现这种可选地参与交易的模式,它会起作用吗(或者它真的不是推荐的做事方式事情)——或者有没有我没有想到的更好的方法?
async function runQueries(trx:ITask<any>):Promise<any[]>
{
const dataset1 = await trx.many(`select * from tableA`);
const dataset2 = await trx.many(`select * from tableB`);
return [dataset1,dataset2];
}
async function trxRunQueries(trx:ITask<any>|undefined = undefined ):Promise<any[]>
{
let result:any[]=[];
try {
// If trx not passed in the create task context
if(!trx)
await db.task(async trx => {result=await runQueries(trx)})
else
result=await runQueries(trx);
return result;
}
catch (err) {
throw(err);
}
}
这种模式由 pg-promise-demo, which uses event extend 实现,以使用 context-agnostic 个实体存储库扩展数据库协议。
我正在尝试实现一种重用模式,其中查询函数 可能 接收参数 trx=tx/task 如果它们参与现有的 transaction/task,并重用 tx/task 上下文...否则,如果 trx=undefined 传入,则为查询创建一个新任务。这个想法是让函数不知道它是被单独使用,还是正在参与高阶块交易。
我想要的(理想情况下)是一个 promise 函数,它将 return 一个任务上下文,这样我就可以像下面这样干净地编写(这是行不通的):
async function trxRunQueries(trx:ITask<any>|undefined = undefined):Promise<any[]>
{
if(!trx)
trx=await db.task(); // if !trx then create new task context from db
const dataset1 = await trx.many(`select * from tableA`);
const dataset2 = await trx.many(`select * from tableB`);
return [dataset1,dataset2];
}
然而,似乎 db.task() 需要在 cb 参数中执行上下文查询,但这让我很困惑,想知道如何在不将代码写出两次的情况下实现所需的模式——一次是db.task(trx => ) 包装器,另一个直接执行 trx.many(...)。
我想知道是否可以做一些骇人听闻的事情,如下所示,以实现这种可选地参与交易的模式,它会起作用吗(或者它真的不是推荐的做事方式事情)——或者有没有我没有想到的更好的方法?
async function runQueries(trx:ITask<any>):Promise<any[]>
{
const dataset1 = await trx.many(`select * from tableA`);
const dataset2 = await trx.many(`select * from tableB`);
return [dataset1,dataset2];
}
async function trxRunQueries(trx:ITask<any>|undefined = undefined ):Promise<any[]>
{
let result:any[]=[];
try {
// If trx not passed in the create task context
if(!trx)
await db.task(async trx => {result=await runQueries(trx)})
else
result=await runQueries(trx);
return result;
}
catch (err) {
throw(err);
}
}
这种模式由 pg-promise-demo, which uses event extend 实现,以使用 context-agnostic 个实体存储库扩展数据库协议。