Есть две таблицы TableA
и TableB
.
Мне нужно скопировать некоторые записи из TableA
в TableB
. Я использую slick-3.0
и использую следующим образом:
import akka.stream._
import akka.stream.scaladsl._
...
//{{ READ DATA FROM TABLE A
val q = TableA.filter(somePredicate).result
val source = Source.fromPublisher {
db.stream(q.result).mapResult { r =>
val record: RecordA = someTransformation(r)
record
}
}.grouped(50) // grouping because I want to write records in batch mode
//}}
//{{ WRITE DATA TO TABLE B
val f:Future[Done] = source.runWith(Sink.foreach { batch: Seq[RecordA] =>
//TODO how to write batch to TableB asynchronously?
val insertAction = TableB ++= batch // insert batch to table
val fInsert: Future[_] = db.run(insertAction)
Await.result(fInsert, ...) // #1 this works only with blocking
})
//}}
Но я столкнулся с проблемой - как записать пакет в TableB
асинхронно (см. TODO). Теперь приведенный выше код работает только с блокировкой во внутреннее будущее (см. комментарий №1). Есть ли правильный способ асинхронной реализации этой задачи?
TableB
. - person John Mullins   schedule 08.06.2017