使用Anorm的SQL语句比PostgreSQL CLI提供了另一个结果

时间:2015-02-05 22:58:11

标签: postgresql scala playframework-2.2 anorm

我想在保存之前检查数据库中是否存在某些内容,以避免key duplicate errors。我将Play! 2.2.6anormPostgresql 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 ...

1 个答案:

答案 0 :(得分:3)

如果在结果集中返回任何,则

execute会返回true。在这种情况下,它将是01。如果查询是更新(不返回结果集),它将仅返回false。您需要使用asResultSetParser来解析结果。

此代码还有另一个问题。您无法在预准备语句中提供列名。 {fieldName}={value}。这将变成一个字符串比较,这可能永远是假的。相反,您可以使用字符串插值将字段名称插入查询中。虽然要小心,fieldName应该来自用户定义的输入,因为它易受SQL注入攻击。 (无论如何,您的用户不需要了解您的列)

SQL(s"SELECT exists(SELECT 1 FROM events where ${fieldName} = {value} LIMIT 1)")
   .on("value" -> value)
   .as(scalar[Boolean].single)