How to convert MySQL-style question mark `?` bound parameters to Postgres-style `$1` bound parameter

二次信任 提交于 2019-12-12 10:13:49

问题


I am converting an existing project from MySQL to Postgres. There are quite a few raw SQL literals in the code that use ? as a placeholder, e.g.

  SELECT
    id
  FROM
    users
  WHERE
    name = ?

But I get this error:

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

I don't want to convert all my existing SQL from ? to postgres-style operators like $1.

Is there some way of having node-postgres accept the question marks instead, or an utility that can convert to postgres style params?

Note that some sort of Regex-based hack is not acceptable because question marks can be inside quotes, or backslash escaped to any depth.


回答1:


Is there some way of having node-postgres accept the question marks instead?

NO. And there is no direct correspondence between ? and $1 syntax, because the latter implies parameter re-use, while ? doesn't allow it. For example, using ? ? ? implies that you have 3 formatting parameters, while $1 $2 $2 implies that you have two formatting parameters.

or an utility that can convert to postgres style params?

Not likely, since there is no direct correspondence, the conversion is possible only one-way, which would make such an utility fairly useless. You can replace everything yourself, with a single regular expression, replacing each ? with $ + index + 1.

I don't want to convert all my existing SQL from ? to postgres-style operators like $1.

You don't really have much choice in this. It has to be done. Besides, $1 is way more flexible than ?, due to parameter re-use, plus optional extensions. For example, pg-promise extends them very nicely, with various formatting modifiers that are needed frequently: ^, ~, :json, :csv, etc...

Note that some sort of Regex-based hack is not acceptable because question marks can be inside quotes, or backslash escaped to any depth.

You will likely spend less time converting your SQL by hand, than the time to write an utility for the one-way proper conversion.




回答2:


Actually converting ? to $1, $2 etc will always work. Converting $1, $2 back to ? won't work if you've repeated parameters.

It would be valuable for those porting software from MySQL and others if PG supported the ? parameter stub.



来源:https://stackoverflow.com/questions/38697600/how-to-convert-mysql-style-question-mark-bound-parameters-to-postgres-style

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!