2016-08-01 33 views
2

我正在将现有项目从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样式参数的实用程序?

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

+1

使用?在查询中不是MySQL,而是应用层,例如Java的。这不应该最有可能改变。你能在代码的上下文中向我们展示这个查询吗? –

+0

你使用的是什么版本的Postgres?因为文档中提到使用'?'(https://www.postgresql.org/docs/9.1/static/ecpg-commands.html)以及这个随机的SO问题(http://stackoverflow.com/questions/10659737/how-can-i-use-a-query-with-placeholder-inside-quotes-perl-postgresql) –

+1

什么是node-postgres,为什么它不在标签中,因为它似乎是你的核心题? – joop

回答

1

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

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

or an utility that can convert to postgres style params?

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

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

你在这方面没有多少选择。它必须完成。此外,$1?更灵活,这是由于参数重用以及可选的扩展。例如,pg-promise扩展他们非常漂亮,与那些经常需要各种格式的修饰符:^~:json:csv等..

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

你可能会花更少的时间用手工将你的SQL,比编写用于单向正确转换的实用程序的时间。