如何使用 pg-promise 创建要在复杂的 sql 查询中使用的值列表?

问题描述 投票:0回答:1

我有一个相当复杂的查询,我试图将其与 pg-promise 放在一起:

sqlfile.sql

WITH insert_and_return AS
  (
    INSERT INTO myTable
      (param_01, param_02, param_03, param_id)
    VALUES
      (${param_01}, ${param_02}, ${param_03}, uuid_generate_v4())  
    RETURNING
      param_id
  )

named_data (name, values) AS
  (
    VALUES
      ${pairs}
  )

INSERT INTO anotherTable
  SELECT ir.param_id, nd.name, nd.values
  FROM insert_and_return AS ir, named_data AS nd;

我需要

${pairs}
看起来像
pgp.helpers.values
的输出,括号内的一系列值(https://vitaly-t.github.io/pg-promise/helpers.html#.values

查询执行看起来像这样:

const data = { one: ['one'], two: ['two']};
// transform to data_pairs
const data_pairs = [ {key: 'one', value: ['one']}, {key: 'two', value: ['tow']} ];

const pairs = pgp.helper.values(data_pairs, ['key', 'value']);
// ('one',array['one']),('two',array['two'])

query = pgp.as.format(sqlFile, { param_01, param_02, param_03, pairs })
await db.none(query)

最后的

query
似乎在
pairs
值周围放置了另一组引号。

// '(''one'',array[''one'']),(''two'',array[''two''])'

有人可以推荐一种方法来生成一组值,如

pairs
以在不添加引号的情况下在 sql 查询文件中使用吗?

sql pg-promise
1个回答
1
投票

这是一个典型的双重转义(双重格式化)错误。

pairs
的值已经预先格式化,所以在SQL中应该作为
${pairs:raw}
使用,避免第二次转义。

参见原始文本过滤器。

此外,代替此代码:

query = pgp.as.format(sqlFile, { param_01, param_02, param_03, pairs })
await db.none(query)

你可以这样写:

await db.none(sqlFile, { param_01, param_02, param_03, pairs });
© www.soinside.com 2019 - 2024. All rights reserved.