2017-11-25 246 views
1

我想向Task表中插入10多行數據,所以我創建了這些記錄的列表。除了我的表,我有一個存儲庫,其中包含諸如創建,更新等功能。所以我可以使用創建一個函數來添加一條記錄,但我想用這個函數批量插入數據。批量插入記錄Slick

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值具有類型單位,我不能db.runAwait.result運行它。由於返回類型不匹配,我的方法createTasks不能編譯。 那麼如何創建批量插入的方法或更改現有的方法? 我會非常感謝任何幫助!

+0

因爲你所描述的計算,不執行他們你需要使用'map'而不是'foreach'。 –

+0

@SeanVieira你的意思是''users.map(userRepository.create(_))''?但它仍然返回用戶列表作爲''Future [List [User]]'',我不能將它傳遞給''db.run''或''Await.result''函數 – Cassie

回答

2

如果你知道在編譯時的動作,使用DBIO.seq()到鏈中的DB操作:

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 
) 
+0

這不完全是我希望我更願意通過任務列表。但是,無論如何謝謝 – Cassie

+0

有道理。請參閱更新的答案。 –

+0

謝謝。這很棒! – Cassie