批量插入记录 Slick
Insert records in batch Slick
我想向任务 table 中插入 10 多行数据,所以我创建了这些记录的列表。除了我的 table,我还有一个具有创建、更新等功能的存储库。所以我可以使用创建一个函数来添加一条记录,但我想使用这个函数来批量插入数据。
case class Task (
idTask: Option[Long],
ownerId: Long,
name: String,
finished: Boolean
)
class TaskTable(tag: Tag) extends Table[Task](tag, "tasks"){
val idTask = column[Long]("id_task", O.PrimaryKey)
val ownerId = column[Long]("owner")
val name = column[String]("name")
val finished = column[Boolean]("finished")
val ownerFk = foreignKey("owner_id_fk", ownerId, TableQuery[UserTable])(_.idUser)
def * = (idTask.?, ownerId, name, finished) <> (Task.apply _ tupled, Task.unapply)
}
object TaskTable{
lazy val table = TableQuery[TaskTable]
}
class TaskRepository(db: Database) {
val taskTableQuery = TableQuery[TaskTable]
def create(task: Task): Future[Task] =
db.run(taskTableQuery returning taskTableQuery += task)
def createTasks(tasks: List[Task]): Future[Option[Task]] =
db.run(taskTableQuery ++= tasks)
def update(task: Task): Future[Int] =
db.run(taskTableQuery.filter(_.idTask === task.idTask).update(task))
def delete(task: Task): Future[Int] =
db.run(taskTableQuery.filter(_.idTask === task.idTask).delete)
def getById(task: Task): Future[Option[Task]] =
db.run(taskTableQuery.filter(_.idTask === task.idTask).result.headOption)
}
我试过这样做:
val tasks = List(
Task(Some(1), 1,"Analyze logs with Spark", false),
Task(Some(2), 1,"Clean and process data", false),
...
)
val createTasks = tasks.map(taskRepository.create(_))
但是这个 createTasks 值的类型是 Unit,我不能用 db.run
或 Await.result
运行 它。由于 return 类型不匹配,我的方法 createTasks 无法编译。
那么如何为批量插入创建此方法或更改现有方法呢?
如果有任何帮助,我将不胜感激!
如果您知道编译时的操作,请使用 DBIO.seq() 链接数据库操作:
db.run(
DBIO.seq( taskTableQuery += Task(....),
taskTableQuery += Task(....),
taskTableQuery += Task(....)...
).transactionally
)
否则,使用DBIO.sequence
:
val taskSeq:Seq[Task] = ... however you get the tasks
db.run(
DBIO.sequence( taskSeq.map(t=>taskTableQuery+=t) ).transactionally
)
我想向任务 table 中插入 10 多行数据,所以我创建了这些记录的列表。除了我的 table,我还有一个具有创建、更新等功能的存储库。所以我可以使用创建一个函数来添加一条记录,但我想使用这个函数来批量插入数据。
case class Task (
idTask: Option[Long],
ownerId: Long,
name: String,
finished: Boolean
)
class TaskTable(tag: Tag) extends Table[Task](tag, "tasks"){
val idTask = column[Long]("id_task", O.PrimaryKey)
val ownerId = column[Long]("owner")
val name = column[String]("name")
val finished = column[Boolean]("finished")
val ownerFk = foreignKey("owner_id_fk", ownerId, TableQuery[UserTable])(_.idUser)
def * = (idTask.?, ownerId, name, finished) <> (Task.apply _ tupled, Task.unapply)
}
object TaskTable{
lazy val table = TableQuery[TaskTable]
}
class TaskRepository(db: Database) {
val taskTableQuery = TableQuery[TaskTable]
def create(task: Task): Future[Task] =
db.run(taskTableQuery returning taskTableQuery += task)
def createTasks(tasks: List[Task]): Future[Option[Task]] =
db.run(taskTableQuery ++= tasks)
def update(task: Task): Future[Int] =
db.run(taskTableQuery.filter(_.idTask === task.idTask).update(task))
def delete(task: Task): Future[Int] =
db.run(taskTableQuery.filter(_.idTask === task.idTask).delete)
def getById(task: Task): Future[Option[Task]] =
db.run(taskTableQuery.filter(_.idTask === task.idTask).result.headOption)
}
我试过这样做:
val tasks = List(
Task(Some(1), 1,"Analyze logs with Spark", false),
Task(Some(2), 1,"Clean and process data", false),
...
)
val createTasks = tasks.map(taskRepository.create(_))
但是这个 createTasks 值的类型是 Unit,我不能用 db.run
或 Await.result
运行 它。由于 return 类型不匹配,我的方法 createTasks 无法编译。
那么如何为批量插入创建此方法或更改现有方法呢?
如果有任何帮助,我将不胜感激!
如果您知道编译时的操作,请使用 DBIO.seq() 链接数据库操作:
db.run(
DBIO.seq( taskTableQuery += Task(....),
taskTableQuery += Task(....),
taskTableQuery += Task(....)...
).transactionally
)
否则,使用DBIO.sequence
:
val taskSeq:Seq[Task] = ... however you get the tasks
db.run(
DBIO.sequence( taskSeq.map(t=>taskTableQuery+=t) ).transactionally
)