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

13 sql postgresql go

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

db.Query(`SELECT COUNT(*) as N FROM email WHERE address = ?`, email)
Run Code Online (Sandbox Code Playgroud)

有这个错误:

pq: F:"scan.l" M:"syntax error at end of input" S:"ERROR" C:"42601" P:"50" R:"scanner_yyerror" L:"993"
Run Code Online (Sandbox Code Playgroud)

有什么问题?PostgreSQL中的错误消息非常神秘.

int*_*tgr 38

您还没有提供有关语言/环境的任何详细信息,但无论如何我都会尝试一下狂野的猜测:

MySQL的准备语句本身使用?作为参数占位符,而PostgreSQL使用$1,$2等尝试更换?$1,看看它的工作原理:

WHERE address = $1
Run Code Online (Sandbox Code Playgroud)

PostgreSQL中的错误消息非常神秘.

一般来说,我发现Postgres错误消息比竞争产品(ahem,MySQL,尤其是 Oracle)更好,但在这种情况下,你已经设法将解析器与理智混淆.:)

  • 请注意,这取决于所使用的编程语言和数据库访问驱动程序.例如,在JDBC中,占位符总是"?".基于DB驱动程序使用不同占位符的想法非常可怕. (5认同)
  • @CraigRinger,但强制每个驱动程序理解一个特定的占位符(比如说`?`)强制客户端实现与目标数据库引擎匹配的完整SQL解析器.此外,`$ N`可能允许您为多个占位符指定一个值,而`?`则不允许. (2认同)
  • @CraigRinger查找`?`的实例很简单.但是如果你认为`?`是一个字符串中的有效字符 - 并且不应该在那里改变,那就太难了!加上所有可能的不同转义规则,这些规则依赖于服务器端设置和Postgres版本,以及一些非常复杂的解析案例,涉及PostgreSQL的`$ foo $?$ foo $`语法.它变得非常糟糕. (2认同)

小智 14

在 golang 中我们可以使用查询

  • MySQL 使用 ? 变体
  • PostgreSQL 使用枚举 $1、$2 等绑定变量语法
  • SQLite 接受两者?和 $1 语法
  • Oracle 使用 :name 语法


sim*_*nke 7

你正在使用Go吗?

尝试:

db.Query(`SELECT COUNT(*) as N FROM email WHERE address = $1`, email)
Run Code Online (Sandbox Code Playgroud)


cal*_*ari 6

就我而言,这是由于使用了 -- 行注释,其中负责与数据库交互的程序将我的查询的多行全部读取为一大行。这意味着行注释破坏了查询的其余部分。修复方法是使用 /* 块注释 */ 代替。