Mysql
 sql >> Database >  >> RDS >> Mysql

Come vengono utilizzati i flussi reattivi in ​​Slick per l'inserimento dei dati

Inserti seriali

Il modo più semplice sarebbe eseguire inserti all'interno di un Sink.foreach .

Supponendo che tu abbia utilizzato la generazione del codice dello schema e supponendo inoltre che la tua tabella sia denominata "NumberTable"

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

val numberTableDB = Database forConfig "NumberTableConfig"

Possiamo scrivere una funzione che esegua l'inserimento

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

E quella funzione può essere collocata nel Lavello

val insertSink = Sink[Int] foreach insertIntoDb

Source(0 to 100) runWith insertSink

Inserti in batch

Puoi estendere ulteriormente la metodologia Sink raggruppando N inserti alla volta:

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

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

Questo lavello in batch può essere alimentato da un Flow che esegue il raggruppamento batch:

val batchSize = 10

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