【问题标题】:Insert Two List of values in play framework SQL anorm在播放框架SQL异常中插入两个值列表
【发布时间】:2015-08-12 13:43:50
【问题描述】:

目前我正在开发 Playframework。我需要使用 Anorm 将两个 List 值插入数据库。一个是names: List[String],另一个是numbers: List[Int],它们的大小相同。

我需要将names 的第一个位置和numbers List 的第一个位置插入RowDatabase Table 中,就像明智地需要在Lists 中插入所有值一样。

我试过了:

 for (no<- 0 to (names.size-1)) {

        SQL(
          """
          insert into table(NAME,NUMBER)
          values(
          names[{no}],numbers[{no}]
          )
        """).on(          
            'no-> no
            ).executeUpdate()
      }

它给了我以下错误[MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[0],numbers[0]

我也尝试过

 for (name<- names;number<- numbers) {

    SQL(
      """
      insert into table(NAME,NUMBER)
      values(
      {name},{number}
      )
    """).on(            
        'name-> name,
        'number-> number
        ).executeUpdate()
  }

但它就像在 java 中一样充当two for loops

for(){
  for(){}
}

【问题讨论】:

    标签: mysql scala playframework playframework-2.3 anorm


    【解决方案1】:

    names[{no}] 的 SQL 语句无法以任何方式工作:数据库没有 Scala 值 names

    你可以使用.zipped:

    scala> (List("A", "B"), List(1.2F, 34.5F)).zipped.foreach { (str, f) => println(s"zipped: $str -> $f") }
    zipped: A -> 1.2
    zipped: B -> 34.5
    

    那么 Anorm 执行如下。

    (names, numbers).zipped.foreach { (name, num) =>
      SQL"insert into table(NAME,NUMBER) values($name, $num)".executeUpdate()
    }
    

    【讨论】:

    • 我有另一个变量 'userId' 用于插入。我使用了下面的代码,但它给出了错误SQL"insert into table(NAME,NUMBER,USER_ID) values($name, $num,{userid})".on('userid -&gt; userid).executeUpdate()
    • 我在一个function 中写了这个insertion 查询,其中useridparameter
    • 我收到以下错误[MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1]
    • 检查你的 SQL 语句语法
    • 这是我的代码我找不到错误def inserDetails(userid: Int, numbers: List[Int],names: List[String]) = { (names, numbers).zipped.foreach { (name,num) =&gt; SQL"insert into test(NAME,NUMBER,USER_ID) values($name, $num,{userid})" .on('userid -&gt; userid) .executeUpdate() } }
    【解决方案2】:

    您应该首先使用zip 组合这两个列表,这样您就有一个列表,其中每个列表元素都是名称和数字的元组:

    val names = List("bob", "steve", "frank")
    
    val numbers = List(1,2,3)
    
    val name_and_numbers = names zip numbers
    
    name_and_numbers.foreach{ tuple =>
      println(s"name: ${tuple._1} number: ${tuple._2}")
    }
    

    【讨论】:

    • 我猜(names, numbers).zipped 在这种情况下效率更高。
    • @cchantep 你能解释一下为什么这样更有效率吗?
    • @mattinbits 我也试过你的代码。但它也显示相同的错误[MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1]
    • val name_and_numbers = names zip numbers name_and_numbers.foreach{ tuple =&gt; SQL"insert into table(NAME,NUMBER,USER_ID) values(${tuple._1}, ${tuple._2},{userid})".on('userid -&gt; userid).executeUpdate() }
    • .zipped 是一个懒惰的观点:scala-lang.org/api/current/…
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多