javascript - 如何根据列长度将值动态添加到 PostgreSQL 查询
问题描述
我正在我的 NodeJS API 中构建一个助手,可以根据客户端输入动态构建查询。
查询现在以这种方式工作:
insertOne(table, columns, params) {
return query(
`INSERT INTO ${table}
(${columns})
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING*`,
params
);
}
该方法需要 3 个参数,即表名、列、要传递给查询的参数。
我能够传递表名和列,但我无法完成如何$1 $2 ... $n
根据列的长度来获取值。
我的意思是,例如,当客户写 3 列传递时,我应该动态生成 $1 $2 $3。
我正在尝试一个 for 循环,但我被卡住了:
let i = 0;
for (const propName in columns) {
q = propName + " = $" + (i ++);
params.push(q[propName]);
i++;
}
我现在以这种方式调用此方法:
async createOne(req, res) {
console.log({ ...req.body });
try {
const product = await Queries.insertOne(
"products",
[
"productname",
"description",
"brand",
"price",
"category",
"imageurl"
],
[
req.body.productname,
req.body.description,
req.body.brand,
req.body.price,
req.body.category,
req.body.imageurl
]
);
res.json({ msg: "Product added", data: product.rows });
} catch (err) {
return res.json({ msg: "POST Something went wrong!", err: err });
}
},
在上述情况下,助手应该看到传递了 6 列并动态生成从 $1 到 $6 的值。
我们的想法是将其与列数可以更改的不同表一起使用。
我希望让自己清楚,如果您需要我提供更多信息,请发表评论。
解决方案
您需要做的就是为数组$n
中的每个元素返回一个逗号分隔params
。
你可以这样做:
function createValuesIds(vals) {
let ids = '';
for (let i = 0; i < vals.length; i++) {
ids += i === 0 ? '$1' : `, $${i + 1}`;
}
return ids;
}
createValuesIds(['a','b','c','d','e','f'])
用返回之类的东西调用它$1, $2, $3, $4, $5, $6
然后你只需在你的函数中使用它:
insertOne(table, columns, params) {
return query(
`INSERT INTO ${table}
(${columns})
VALUES (${createValuesIds(params)})
RETURNING *`,
params
);
}
它将正确构建您的查询。
推荐阅读
- angularjs - 来自 Angular 的 MEAN 堆栈绑定不起作用
- opengl - OpenGL 3.3:如何在传递给顶点和片段着色器之前实现解压缩纹理数据
- javascript - 在我的 Discord Bot 中丢失 Quick.db 的数据
- python - 如何在 Python 中打开多个加密的 PDF 并在没有密码的情况下保存
- javascript - 如何从js中的文本字段中获取整数?
- arrays - 将 Matlab 网格转换为向量
- docker - VSCode“无法打开
无法读取文件” - android - Kotlin android 数据绑定问题在应用程序中失败:kaptDebugKotlin
- python - 如何使用python从sql表中获取多个结果
- c# - OpenXML SDK C#:如何将书签内容从 1 个单词文件复制到另一个单词文件