如何将1000批记录插入db?

时间:2014-06-30 10:44:46

标签: scala bulkinsert slick

我正在读取一个巨大的文件,并使用预编译语句的statement.executeBatch()在mysql中插入记录。以下是代码:

for(int i = 0; i < file.length; i++) {

      count += 1
      statement.setString(1, record.id)
      statement.setString(2, record.date)
      statement.setString(3, record.msg)
      statement.addBatch()

      if (count % 1000 == 0) 
          statement.executeBatch()
}
statement.executeBatch() 

Slick如何帮助(也许模仿上面的代码)?

1 个答案:

答案 0 :(得分:5)

使用Slick 2.0.2

一旦你有一个建模数据的案例类,你的Table类和你定义的TableQuery对象,只需将文件读入Seq,然后使用++ =函数将其添加到TableQuery对象。

case class MyDataClass(id: String, date: String, msg: String)

class MyData(tag: Tag) extends Table[MyDataClass](tag,"mydatatableInDB") {
   def id = column[String]("id")
   def date = column[String]("date")
   def msg = column[String]("msg")

   def * = (id, date, msg) <> (MyDataClass.tupled)(MyDataClass.unapply)
}

val myDataTableQuery = TableQuery[MyData]

// read your data into a Seq[MyDataClass] (for example) and...

myDataTableQuery ++= listWithData

如果确实需要使用批处理,可以使用分组对元素进行分组,并对它们进行迭代,在每次迭代时将数据添加到表查询中。像这样:

// With your data already in a Seq
def insertIntoTableQuery(data: List[MyDataClass) = {
    myDataTableQuery ++= data
}

// make groups of 1000 and iterate    
listWithData.grouped(1000) foreach insertInToTableQuery

除非我遗漏了某些内容,否则我认为文档中已经涵盖了这一点:

Slick 2.0.2 Documentation

几周前,我有类似的任务。我正在使用的文件有350,000多行,每行我必须提取数据并创建几个对象,每个对象都要插入另一个表中。请注意,我并不需要批量进行,而且速度非常快。