SQL 语句与 Anorm 给了我一个不同于 PostgreSQL CLI 的结果
SQL statement with Anorm gives me an other result than in PostgreSQL CLI
我想在保存之前检查我的数据库中是否存在某些内容以避免 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()
}
}
但它总是 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。在这种情况下,它将是 0
或 1
。它只会 return false
如果查询是更新(return 没有结果集)。您需要使用 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)
我想在保存之前检查我的数据库中是否存在某些内容以避免 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()
}
}
但它总是 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。在这种情况下,它将是 0
或 1
。它只会 return false
如果查询是更新(return 没有结果集)。您需要使用 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)