我正在使用Groovy Sql在Grails中使用命名参数从Postgres DB获取结果。我的语句是动态生成的,即被连接起来成为最终语句,并且在我进行操作时将参数添加到映射中。
sqlWhere += " AND bar = :namedParam1"
paramsMap.namedParam1 = "blah"
为了更好的可读性,我使用groovy字符串语法,使我可以将SQL语句分成多行编写,如下所示:
sql = """
SELECT *
FROM foo
WHERE 1=1
${sqlWhere}
"""
表达式被计算为包含换行符 \n 的字符串:
SELECT *\n ...
当我像这样传递参数时,这不是一个问题。
results = sql.rows(sqlString, paramsMap)
但是如果paramsMap为空(这种情况发生了,因为AND bar = :namedParam1
并不总是被连接到查询中)它就会变成一个错误。我会收到一个错误提示。
org.postgresql.util.PSQLException: No hstore extension installed
这似乎并不真正涉及问题的本质。目前我已经通过if...else解决了这个问题。
if (sqlQuery.params.size() > 0) {
results = sql.rows(sqlString, paramsMap)
} else {
results = sql.rows(sqlString.replace('\n',' '))
}
但这似乎有点奇怪(特别是如果我在if分支中也使用replace,它就不起作用)。
我的问题是:为什么我真的会收到这个错误消息,是否有更好的方法来防止它发生?
sqlString
是sql
?或者你周围有一些def sqlString = sql.toString()
的代码吗?如果你将一个GString
传递给 Groovy SQL,它会为你引用${...}
,最终导致错误的 SQL。 - cfrickCREATE EXTENSION hstore;
- RaotoString()
,但错误仍然存在。 - Roland