【问题标题】:Prepared Statement doesn't recognize any parameters on Postgres JS bindingPrepared Statement 无法识别 Postgres JS 绑定上的任何参数
【发布时间】:2018-10-10 19:26:27
【问题描述】:

我正在尝试一次更新多行。 为此,我准备了以下声明:

WITH new_values (id, data, email) AS (
  VALUES ($1, $2, $3), ($4, $5, $6), ($7, $8, $9), ($10, $11, $12)
)
UPDATE prospects
  SET 
    data = new_values.data,
    email = new_values.email
  FROM new_values
  WHERE
    prospects.id = new_values.id
  RETURNING *

但我收到以下错误:

error: bind message supplies 12 parameters, but prepared statement "prospects-multi-update" requires 0
api-prospects_1       |     at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:546:11)
api-prospects_1       |     at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:371:19)
api-prospects_1       |     at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:114:22)
api-prospects_1       |     at Socket.emit (events.js:180:13)
api-prospects_1       |     at addChunk (_stream_readable.js:274:12)
api-prospects_1       |     at readableAddChunk (_stream_readable.js:261:11)
api-prospects_1       |     at Socket.Readable.push (_stream_readable.js:218:10)
api-prospects_1       |     at TCP.onread (net.js:581:20)

我尝试了不同的查询(使用INSERT ... ON CONFLICT DO UPDATE),但效果相同。

它仅适用于直接的 INSERT INTO 查询。


编辑

以下是调用此查询的代码: (我删除了字符串生成函数,因为它不是很有用)

const upsertValues = async (entities) => {
  if (entities.length === 0) return []

  const client = pool.connect()

  const values = [...]
  const variables = [...]
  const setStatements = [...]

  const res = await client.query({
    name: `${resourceName}-multi-update`,
    test: `
      WITH new_values (id, ${columns}) AS (
        VALUES ${variables}
      )
      UPDATE prospects
        SET ${setStatements}
        FROM new_values
        WHERE
          prospects.id = new_values.id
        RETURNING *
    `,
    values: flatten(values),
  })

  return res.row || []
}

【问题讨论】:

  • 您应该包含用于执行查询的代码。很可能问题出在某个地方。
  • @vitaly-t 我已经用调用站点上的代码进行了编辑。我刚刚删除了查询不同部分的生成,因为它只是字符串操作并且生成的查询是正确的。
  • 查询必须作为属性text 传入,而不是test
  • @vitaly-t 是的,我发现了......该死的动态打字。
  • @vitaly-t 如果你想让我接受,你可以回答这个问题。

标签: sql postgresql common-table-expression node-postgres


【解决方案1】:

错误是由于准备好的语句的属性text被错误命名为test,所以引擎甚至找不到查询字符串。

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多