【问题标题】:Inserting multiple values into table with anorm使用异常将多个值插入表中
【发布时间】:2013-01-18 12:15:04
【问题描述】:

我想从 Anorm 的 SQL 查询中将多个值插入到表中。在下面的 sn-p 中,有没有办法将用户名列表绑定为值而不是一个用户名?

SQL("insert into users (username) " +
      "values ({username})").on(
      'username -> username,
    ).executeUpdate()

作为替代方案,我可以从我的输入中创建一个连接字符串,但这很容易受到 SQL 注入并且不是很干净。

【问题讨论】:

    标签: scala playframework-2.0 anorm


    【解决方案1】:

    使用 Anorm 一次插入多个值的可能方法:

    var fields: List[String] = Nil
    var values: List[(String,ParameterValue[_])] = Nil
    
    for ((username,i) <- usernames.zipWithIndex) {
      fields ::= "({username%s})".format(i)
      values ::= ("username" + i, username)
    }
    
    SQL("INSERT INTO users (username) VALUES %s".format(fields.mkString(",")))
      .on(values: _*)
      .executeUpdate()
    

    【讨论】:

    • 我想我正在使用的 anorm 版本有点变化;我需要做var values: List[NamedParameter] = Nil 因为ParameterValue 不接受类型参数并且.on(values: _*) 似乎无法从元组列表中找到隐式转换。鉴于此,它是一种享受,应该是公认的答案。
    【解决方案2】:

    您要对所有值重复插入命令吗?

    如何将其包装在 foreach 中:

    usernames.foreach(username =>
      SQL("insert into users (username) " +
        "values ({username})").on(
        'username -> username,
      ).executeUpdate())
    

    或者类似的东西。

    Anorm 是一个相对简单的库——查看这里的代码: https://github.com/playframework/Play20/tree/master/framework/src/anorm/src/main/scala/anorm

    【讨论】:

    • 他想在一个请求中进行多次插入(我想是为了优化),比如insert into users(username) VALUES 'julien', 'clara', 'paul')
    • 是的,我认为这是一种可能性。 Anorm 不知道您正在执行插入操作,因此它不知道如何执行此类操作。它没有那么复杂。
    • 没错,我正在寻找一种同时插入多个值的方法,就像@JulienLafont 建议的那样。好像没有我需要的东西,所以我自己创建sql查询字符串。
    • 在此处查看 David Ross 的回复:groups.google.com/d/msg/play-framework/meYkd-KKQRE/rdVmOJ9TO78J ...也许通过一些重建,您也可以将其用于多个插入? (这在我头上。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多