sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo se utilizan los flujos reactivos en Slick para insertar datos?

Inserciones en serie

La forma más fácil sería hacer inserciones dentro de un Sink.foreach .

Suponiendo que haya utilizado la generación de código de esquema y suponiendo además que su tabla se llame "NumberTable"

//Tables file was auto-generated by the schema code generation
import Tables.{Numbertable, NumbertableRow} 

val numberTableDB = Database forConfig "NumberTableConfig"

Podemos escribir una función que haga la inserción

def insertIntoDb(num : Int) = 
  numberTableDB run (Numbertable += NumbertableRow(num))

Y esa función se puede colocar en el fregadero

val insertSink = Sink[Int] foreach insertIntoDb

Source(0 to 100) runWith insertSink

Inserciones por lotes

Puede ampliar aún más la metodología Sink agrupando N inserciones a la vez:

def batchInsertIntoDb(nums : Seq[Int]) = 
  numberTableDB run (Numbertable ++= nums.map(NumbertableRow.apply))

val batchInsertSink = Sink[Seq[Int]] foreach batchInsertIntoDb

Este sumidero por lotes puede ser alimentado por un Flow que hace la agrupación por lotes:

val batchSize = 10

Source(0 to 100).via(Flow[Int].grouped(batchSize))
                .runWith(batchInsertSink)