【问题标题】:Using `on` to replace placeholders in Scala SQL query使用 `on` 替换 Scala SQL 查询中的占位符
【发布时间】:2014-03-03 17:28:12
【问题描述】:

我正在尝试创建一个 findBy 方法,该方法采用键和值来搜索表。由于某种原因,以下内容没有找到任何东西:

def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection =>
  SQL("select * from authentications where {key}='{value}' limit 1")
    .on("key" -> key, "value" -> value).as(authentication.singleOpt)
}

但是当我只使用加号时,它确实如此。我不介意以这种方式保留它,但能够使用on 有好处

def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection =>
  SQL("select * from authentications where " + key + "='" + value + "' limit 1")
    .as(authentication.singleOpt)
}

示例查询:Authentication.findBy("email", "test@example.com")

【问题讨论】:

    标签: sql scala playframework-2.0 anorm


    【解决方案1】:

    Play 在准备好的 SQL 语句中转义查询参数。因此,您实际上不需要将 {value} 括在单引号中。不幸的是,这意味着 Play 也会用引号对列名进行转义,因此数据库会将其解释为字符串。如果不使用字符串连接或字符串插值,我看不到解决方法。

    Scala 字符串插值会使代码看起来更好一些:

    def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection =>
        SQL(s"select * from authentications where `$key` = {value} limit 1")
           .as(authentication.singleOpt)
           .on("value" -> value).as(authentication.singleOpt)
    }
    

    注意字符串开头之前的“s”。 scala 编译器会将标记 $key 替换为范围内的字符串 key。这应该可以,但key 不会被转义。所以你必须自己清理key 的输入,除非你只在内部使用它。此外,需要注意的是,key 的输入不是表中的列,将引发SQLException

    【讨论】:

    • 这很有趣,但是,反引号在 sql 中不起作用,我无法让这种特殊方法起作用。我不知道我做错了什么。
    • 反引号在 MySQL 中对我有用,但也许你的结果可能会有所不同。
    • 啊,我用的是postgresql,谢谢,很有帮助。
    猜你喜欢
    • 2020-06-09
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2013-01-24
    相关资源
    最近更新 更多