预言机节点执行许多动态SQL查询



>我正在尝试使用 executeMany 语句进行更新查询。我已经尝试像这样异步执行每个循环

export const asyncForEach = async (array, callback) => {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}

然后一些动态定义

export const buildDynamicDefs = (data,enumRef) => {
const defs = {...data};
Object.keys(defs).forEach(key => defs[key] = enums.typeDefs[enumRef][key])
return defs;
};

然后最后执行调用

await asyncForEach(dataArray, async (device) => {
response[device.deviceId] = await connection.execute(
queryPut(device),
{
bind1,
...device,
},
{
autoCommit: false,
bindDefs: {
bind1,
...buildDynamicDefs(device,'enumName'),
},
},
)
})

和查询如下所示:

export const queryPut = data => `
UPDATE status 
SET MANDATORY_PROP1=:bind4 
${data.bind2 && ',OPT_PROP1=:bind2' || ''} 
${data.bind3 && ',OPT_PROP2=:bind3' || ''}
WHERE MANDATORY_PROP2=:bind1 AND MANDATORY_PROP3=:bind5`;

问题是当我使用executeMany时,我不知道如何告诉查询它应该是什么样子

.executeMany(query,arrayOfObject-binds,options)

只有一个查询。我的对象数组可能如下所示:

[
{
bind1: 1,
bind4: 4,
bind5: 5,
},
{
bind1: 1,
bind2: 2,
bind4: 4,
bind5: 5,
},
]

是否有可能在 sql 中选择添加或包含该集合 OPT_PROP1=:bind2? 是否对绑定的空值进行了一些检查?

使用执行它可以工作,但我认为它对大量数据没有效率。

谢谢

经过一些调查,我需要做的就是稍微更改一下 SQL:

UPDATE status 
SET MANDATORY_PROP1=:bind4, 
OPT_PROP1=COALESCE(:bind2,OPT_PROP1), 
OPT_PROP2=COALESCE(:bind3,OPT_PROP2),
WHERE MANDATORY_PROP2=:bind1 AND MANDATORY_PROP3=:bind5`;

最新更新