问题描述
我正在尝试使用 node.js 动态创建一个 sqlite 插入字符串。我有:
while True:
My Code
time.sleep(43200)
当我运行它时:
function update_json_obj_into_table(tablename,obj,search_condition) {
const insertValues = Object.entries(obj).reduce((acc,[k,v]) => acc.push(`${k} = ${v}`),[]);
const insertValuesstring = Array.prototype.join.call(insertValues,'/');
console.log(insertValuesstring);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesstring} WHERE search_condition ;`);
};
我明白了:
const obj = {Code: 'A1'};
update_json_obj_into_table('mytable','search_condition')
显然,insertValues 工作不正常。我期待:
代码 = 1
但它以 '1' 的形式出现。我做错了什么?
解决方法
.push
返回数组的新长度,而不是变异后的数组。虽然您可以将 .push
放在单独的行上并在下一行返回数组:
function update_json_obj_into_table(tablename,obj,search_condition) {
const insertValues = Object.entries(obj).reduce((acc,[k,v]) => {
acc.push(`${k} = ${v}`);
return acc;
},[]);
const insertValuesString = Array.prototype.join.call(insertValues,'/');
console.log(insertValuesString);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};
const obj = {
Code: 'A1'
};
update_json_obj_into_table('mytable','search_condition')
使用 .map
会更有意义,因为输入数组和输出 insertValues
数组是一对一的:
function update_json_obj_into_table(tablename,search_condition) {
const insertValues = Object.entries(obj)
.map(([k,v]) => `${k} = ${v}`);
const insertValuesString = Array.prototype.join.call(insertValues,'search_condition')
也就是说,像这样动态构造的查询很少是一个好主意 - 除非输入值得信赖,否则它可能会危及您的数据库。即使输入是值得信赖的,由于分隔符转义问题、保留作品等,它也可能不优雅。最好查找一下如何使用准备好的语句,以便数据库驱动程序处理外部值的插值。