Groovy sql.rows 返回 org.postgresql.util.PSQLException:未安装 hstore 扩展

Rol*_*and 6 postgresql grails groovy

我在 Grails 中使用 Groovy Sql 和命名参数来从 Postgres DB 获取结果。我的语句是动态生成的,即连接起来成为最终语句,随着我的进行,参数被添加到映射中。

sqlWhere += " AND bar = :namedParam1"
paramsMap.namedParam1 = "blah"
Run Code Online (Sandbox Code Playgroud)

为了便于阅读,我使用了 groovy 字符串语法,它允许我在多行上编写 sql 语句,如下所示:

sql = """
      SELECT *
      FROM foo
      WHERE 1=1
      ${sqlWhere}
      """
Run Code Online (Sandbox Code Playgroud)

该表达式被计算为包含换行符为 \n 的字符串:

SELECT *\n ...
Run Code Online (Sandbox Code Playgroud)

当我像这样传递参数时这不是问题

results = sql.rows(sqlString, paramsMap)
Run Code Online (Sandbox Code Playgroud)

但如果 paramsMap 为空,它就会变成 1(这种情况会发生,因为AND bar = :namedParam1并不总是连接到查询中)。然后我得到一个错误

org.postgresql.util.PSQLException: No hstore extension installed  
Run Code Online (Sandbox Code Playgroud)

这似乎与问题的本质无关。我现在已经用 if...else 解决了这个问题

if (sqlQuery.params.size() > 0) {
    results = sql.rows(sqlString, paramsMap)
} else {
    results = sql.rows(sqlString.replace('\n',' '))
}
Run Code Online (Sandbox Code Playgroud)

但这似乎有点奇怪(特别是因为如果我也在 if 分支中使用替换,它就不起作用)。

我的问题是:为什么我真的收到此错误消息,是否有更好的方法来防止它发生?

Clé*_*des 3

这肯定是 groovy.sql.SQL 实现中的一个错误。该方法rows()无法处理作为 传递的空映射params。作为解决方法,您可以测试它并传递一个空列表

def paramsMap = [:]
...
if (paramsMap.isEmpty())
    paramsMap= []
Run Code Online (Sandbox Code Playgroud)

在https://issues.apache.org/jira/browse/GROOVY-8082创建的问题

  • GROOVY-8082 现已解决。下一个版本 2.4.9 预计将在一两周内发布。现在,您可以为不需要替换占位符值的情况指定一个空映射。 (2认同)