【问题标题】:How to convert MySQL-style question mark `?` bound parameters to Postgres-style `$1` bound parameter如何将 MySQL 样式的问号“?”绑定参数转换为 Postgres 样式的“$1”绑定参数
【发布时间】:2016-12-06 11:02:48
【问题描述】:

我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如

  SELECT
    id
  FROM
    users
  WHERE
    name = ?

但我收到此错误:

DB query error: error: operator does not exist: character varying = ?

我不想将我现有的所有 SQL 从 ? 转换为 postgres 样式的运算符,例如 $1

有没有办法让 node-postgres 接受问号,或者可以转换为 postgres 样式参数的实用程序?

请注意,某种基于正则表达式的破解是不可接受的,因为问号可以在引号内,或者反斜杠可以转义到任何深度。

【问题讨论】:

  • 使用 ?查询中的不是 MySQL,而是应用层,例如爪哇。这很可能不需要更改。你能在代码的上下文中向我们展示这个查询吗?
  • 您使用的是什么版本的 Postgres?因为文档提到使用? (postgresql.org/docs/9.1/static/ecpg-commands.html) 以及这个随机的 SO 问题 (stackoverflow.com/questions/10659737/…)
  • 什么是node-postgres,为什么它不在标签中,因为它似乎是您问题的核心?
  • @joop 看起来这是 postgres 的 node.js 接口。这使我的评论无关紧要。

标签: mysql node.js node-postgres


【解决方案1】:

实际转换?到 1 美元、2 美元等将始终有效。将 1 美元、2 美元转换回 ?如果您重复参数,将无法正常工作。

如果 PG 支持 ?参数存根。

【讨论】:

    【解决方案2】:

    有没有办法让 node-postgres 接受问号?

    没有。并且?$1语法之间没有直接对应关系,因为后者意味着参数重用,而?不允许。例如,使用? ? ? 表示您有3 个格式参数,而$1 $2 $2 表示您有两个格式参数。

    或可以转换为 postgres 样式参数的实用程序?

    不太可能,因为没有直接的对应关系,所以只能单向转换,这会使这样的实用程序相当无用。您可以自己替换所有内容,使用单个正则表达式,将每个 ? 替换为 $ + index + 1

    我不想将我现有的所有 SQL 从 ? 转换为 postgres 样式的运算符,例如 $1

    在这方面你真的没有太多选择。它必须完成。此外,$1? 更灵活,因为参数重用,加上可选的扩展。例如,pg-promise 很好地扩展了它们,并带有各种经常需要的格式修饰符:^~:json:csv 等...

    请注意,某种基于正则表达式的破解是不可接受的,因为问号可以在引号内,或者反斜杠可以转义到任何深度。

    与编写用于单向正确转换的实用程序相比,您可能会花费更少的时间手动转换 SQL。

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多