带有Anorm的SQL语句提供了PostgreSQL CLI以外的其他结果
我想在保存数据库之前检查数据库中是否存在某些内容,以避免出现键重复错误。我在玩!2.2.6使用anorm和Postgresql 9.3 所以我写了一个小函数,省略了错误检查:带有Anorm的SQL语句提供了PostgreSQL CLI以外的其他结果,postgresql,scala,playframework-2.2,anorm,Postgresql,Scala,Playframework 2.2,Anorm,我想在保存数据库之前检查数据库中是否存在某些内容,以避免出现键重复错误。我在玩!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 wher
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
所以我试着去替换
选择ExistsSelect1 FROM events,其中{fieldName}={value}LIMIT 1
借
选择退出从name='aname'限制为1的事件中选择1
而且它总是会回到真实的状态
我还直接在psql中测试了相同的查询,结果是:false…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)