我想在保存之前检查数据库中是否存在某些内容,以避免key duplicate errors
。我将Play! 2.2.6
与anorm
和Postgresql 9.3
一起使用。
所以我写了一个小函数(我省略了错误检查):
def testIfExist(fieldName: String, value: String): Boolean = {
DB.withConnection { implicit connection =>
SQL( """SELECT exists(SELECT 1 FROM events where {fieldName}={value} LIMIT 1)""")
.on(
'fieldName -> fieldName,
'value -> value
).execute()
}
}
但它始终返回true
,尽管我的数据库完全是空的。
所以我测试了替换
SELECT exists(SELECT 1 FROM events where {fieldName}={value} LIMIT 1
通过
SELECT exists(SELECT 1 FROM events where name='aname' LIMIT 1
它仍然总是返回true
...
我还在psql
中直接测试了相同的查询,而我的回答除外:false
...
答案 0 :(得分:3)
execute
会返回true
。在这种情况下,它将是0
或1
。如果查询是更新(不返回结果集),它将仅返回false
。您需要使用as
和ResultSetParser
来解析结果。
此代码还有另一个问题。您无法在预准备语句中提供列名。 {fieldName}={value}
。这将变成一个字符串比较,这可能永远是假的。相反,您可以使用字符串插值将字段名称插入查询中。虽然要小心,fieldName
应该来自用户定义的输入,因为它易受SQL注入攻击。 (无论如何,您的用户不需要了解您的列)
SQL(s"SELECT exists(SELECT 1 FROM events where ${fieldName} = {value} LIMIT 1)")
.on("value" -> value)
.as(scalar[Boolean].single)