SQL 语句与 Anorm 给了我一个不同于 PostgreSQL CLI 的结果

SQL statement with Anorm gives me an other result than in PostgreSQL CLI

我想在保存之前检查我的数据库中是否存在某些内容以避免 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()
  }
}

但它总是 return true 尽管我的数据库完全是空的。

所以我测试替换

SELECT exists(SELECT 1 FROM events where {fieldName}={value} LIMIT 1

来自

SELECT exists(SELECT 1 FROM events where name='aname' LIMIT 1

它仍然总是 return true...

我还在 psql 中直接测试了相同的查询,响应是我除了:false...

execute returns true 如果 anything 在结果集中 returned。在这种情况下,它将是 01。它只会 return false 如果查询是更新(return 没有结果集)。您需要使用 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)