Go语言 PostgreSQL中输入结束时的语法错误

kh212irz  于 2023-04-18  发布在  Go
关注(0)|答案(5)|浏览(143)

我在MySQL和PostgreSQL中都使用了下一个SQL语句,但它在PostgreSQL中失败了

db.Query(`SELECT COUNT(*) as N FROM email WHERE address = ?`, email)

这个错误:

pq: F:"scan.l" M:"syntax error at end of input" S:"ERROR" C:"42601" P:"50" R:"scanner_yyerror" L:"993"

PostgreSQL中的错误消息非常晦涩难懂。

3phpmpom

3phpmpom1#

你还没有提供关于语言/环境的任何细节,但我还是会尝试一个大胆的猜测:
MySQL的prepared语句本身使用?作为参数占位符,但PostgreSQL使用$1$2等。尝试将?替换为$1,看看是否有效:

WHERE address = $1

PostgreSQL中的错误消息非常隐晦。
总的来说,我发现Postgres的错误消息比竞争产品(啊哈,MySQL和 * 特别是 * Oracle)更好,但在这种情况下,你已经成功地混淆了解析器。

t0ybt7op

t0ybt7op2#

在golang中,我们使用

  • MySQL使用?变量
  • PostgreSQL使用枚举的$1、$2等bindvar语法
  • SQLite同时接受?和$1语法
  • Oracle使用:name语法
brccelvz

brccelvz3#

你用的是Go吧?
尝试:

db.Query(`SELECT COUNT(*) as N FROM email WHERE address = $1`, email)
zwghvu4y

zwghvu4y4#

在我的例子中,这是由于使用了-- line注解,负责与数据库交互的程序将我的查询的多行都作为一个巨大的行读取。这意味着行注解破坏了查询的其余部分。修复方法是使用/* 块注解 */。

wko9yo5t

wko9yo5t5#

另一种可能性-检查IFLOOP等是否缺少END指令。
我在循环中工作了很长时间,以至于我没有意识到我从来没有放入END LOOP;
Postgres的消息:

ERROR:  syntax error at end of input
LINE XX: $$;

在告诉你某个结构是否从未关闭时是非常没有帮助的。

相关问题