Scala Slick批量插入数组

时间:2014-02-01 06:15:01

标签: scala slick

我将一个长字符串拆分为一个字符串数组,然后我想将它们全部插入到数据库中。我可以轻松地遍历数组并逐个插入,但它似乎非常低效。然后我认为有insertAll()方法。但是,insertAll()方法定义如下:

def insertAll(values: U*)

这只接受多个U,但不接受ArrayList

/* Insert a new Tag  */
def insert(insertTags: Array[String])(implicit s: Session) {
  var insertSeq: List[Tag] = List()
  for(tag <- insertTags) {
    insertSeq ++= new Tag(None, tag)
  }
  Tag.insertAll(insertSeq)

}

* Tag是表格对象

这是我写的初步代码。它不起作用,因为insertAll()没有Seq。我希望有一种方法可以做到这一点......因此它不会生成数组长度乘以SQL插入子句。

1 个答案:

答案 0 :(得分:7)

当函数需要重复参数(例如U *)并且您想要传递U序列时,必须将其标记为序列参数,使用: _*完成,如

Tag.insertAll(insertSeq: _*)

这在6.6节的说明书中有所描述。它消除了一些情况,如;

def f(x: Any*)
f(Seq(1, "a"))

在那里,f可以用一个参数Seq(1, "a")或两个,1"a"来调用。它将是前者,后者用f(Seq(1,“a”):_ *)完成。 Python有类似的语法。


关于评论中的问题: 它适用于Seq,与Seq相关的集合,以及可以隐式转换为Seqs(包括Arrays)的值。这意味着很多收藏品,但不是全部。例如,不允许Set(但它们有一个toSeq方法,因此使用Set调用仍然很容易)。

它不是一种方法,它更像是一种类型的抄写。它只是告诉编译器这个参数本身是完整的预期Seq,而不是序列参数中的唯一项。