我在帶有命名參數的Grails中使用Groovy Sql以從Postgres數據庫獲取結果。我的聲明是動態生成的,即連接成最終聲明,並隨着我一直沿着這些參數添加到地圖中。Groovy sql.rows返回org.postgresql.util.PSQLException:未安裝hstore擴展
sqlWhere += " AND bar = :namedParam1
paramsMap.namedParam1 = "blah"
爲了增強可讀性,我將使用Groovy字符串語法,讓我多行寫我的SQL語句,就像這樣:
sql = """
SELECT *
FROM foo
WHERE 1=1
${sqlWhere}
"""
計算表達式爲包含的換行符爲一個字符串\ n:
SELECT *\n ...
這不是一個問題,當我通過PARAMS這樣
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',' '))
}
固定這個但這似乎有點不可思議(尤其是因爲如果我使用的,如果分支替換它不工作)。
我的問題是:爲什麼我真的得到這個錯誤信息,並有更好的方法來防止它發生?
我的猜測是創造,是你的'sqlString'是'sql'?或者你有一些'def sqlString = sql.toString()'?如果你將一個'GString'傳遞給groovy sql,它會爲你引用'$ {...}',並且你最終會使用假SQL。 – cfrick
檢查是否運行SQL幫助 - 「CREATE EXTENSION hstore;' – Rao
嗨@cfrick,我有def String String sqlString作爲聲明,但它成爲一路上的GString。我現在在將'toString()'傳遞給'sql.rows'之前添加了一個'toString()',但錯誤仍然存在 – Roland