在播放框架 SQL 异常中插入两个值列表

Insert Two List of values in play framework SQL anorm

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

我需要在 Database Table 中的相同 Row 中插入 names 的第一个位置和 numbers List 的第一个位置,同样需要将所有值插入两个 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(){}
}

您应该先使用 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[{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()
}