>我正在尝试使用 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`;