首页 > 解决方案 > 如何根据列长度将值动态添加到 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 的值。

我们的想法是将其与列数可以更改的不同表一起使用。

我希望让自己清楚,如果您需要我提供更多信息,请发表评论。

标签: javascriptnode.jspostgresql

解决方案


您需要做的就是为数组$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
  );
}

它将正确构建您的查询。


推荐阅读