2014-02-01 8 views
5

Я разбиваю длинную строку на массив строк, а затем хочу вставить их все в базу данных. Я могу легко пройти через массив и вставить один за другим, но он кажется очень неэффективным. Тогда я думаю, что есть метод insertAll(). Однако метод insertAll() определяется следующим образом:Scala Slick Bulk Insert with Array

def insertAll(values: U*)

Это принимает только несколько U, но не Array или List.

/* 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-вставку.

ответ

7

Когда функция ожидать повторен параметры, такие как U * и вы хотите передать последовательность U вместо этого, он должен быть помечен как аргумент последовательности, что делается с : _* как в

Tag.insertAll(insertSeq: _*) 

Это описанных в описании в разделе 6.6. Он устраняет некоторые ситуации, такие как;

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

Там, е можно было бы назвать с одним аргументом, Seq(1, "a") или два, 1 и "a". Он будет первым, последний выполняется с f (Seq (1, «a»): _ *). Python имеет аналогичный синтаксис.


Что касается вопросов в ваш комментарий: Он работает с послед, коллекции, confoms в послед, и значения, которые могут быть неявно преобразованы в Seqs (который включает в себя массивы). Это означает много коллекций, но не все из них. Для экземпляров Set не разрешены (но у них есть методы toSeq, поэтому их можно легко вызвать с помощью Set).

Это не метод, он больше похож на тип абзаца. Он просто сообщает компилятору, что этот аргумент представляет собой полный ожидаемый Seq сам по себе, а не единственный элемент в аргументе последовательности.

+0

Этот маркер аргумента последовательности ': _ *' применяется только к 'Seq' или относится к другим коллекциям? Как работает ': _ *', если вы не возражаете, чтобы я спросил? Это метод? Встроенная итерация? –

+0

См. Http://stackoverflow.com/questions/1124099/what-is-the-meaning-of-colon-underscore-and-star-in-lifts-sitemapentries и http://stackoverflow.com/questions/1124099/ то, что-это-заместитель означает, из толстой кишки-подчеркивания-и-звезды-в-лифтовых-sitemapentries. – OlivierBlanvillain