我是一个光滑的初学者,只是尝试使用Slick 3.0 RC1。在我的第一个项目中,我想将数据从文本文件导入到各种表中。整个导入应按顺序发生,因为数据在一个事务中的文件中。
我尝试创建动作的迭代器并将它们包装在DBO.sequence中。
问题是,当行数很大时,导入会因StackOverflowError而失败。显然我误解了如何使用Slick来做我想做的事情。有没有更好的方法将大量数据链接到一个事务中?
这是我的代码的简化版本,我只是从一个Range中“导入”数字,而不是从文件中读取数据。表XS的偶数表,YS表的奇数表。
val db = Database.forConfig("h2mem1")
try {
class Xs(tag: Tag) extends Table[(Long, String)](tag, "XS") {
def id = column[Long]("ID", O.PrimaryKey)
def name = column[String]("NAME")
override def * : ProvenShape[(Long, String)] = (id, name)
}
class Ys(tag: Tag) extends Table[(Long, String)](tag, "YS") {
def id = column[Long]("ID", O.PrimaryKey)
def name = column[String]("NAME")
override def * : ProvenShape[(Long, String)] = (id, name)
}
val xs = TableQuery[Xs]
val ys = TableQuery[Ys]
val setupAction = DBIO.seq((xs.schema ++ ys.schema).create)
val importAction = DBIO.sequence((1L to 100000L).iterator.map { x =>
if (x % 2 == 0) {
xs +=(x, x.toString)
} else {
ys +=(x, x.toString)
}
})
val f = db.run((setupAction andThen importAction))
Await.result(f, Duration.Inf)
} finally {
db.close
}