插入不能在 slick 中工作的对象列表

inserting a list of objects not working in slick

我用的是slick3.1.1 我想在数据库中插入一个对象列表(postgres) 我写了以下有效的代码

for(user<-x.userList)
{ 
    val users = userClass(user.name,user.id)                
    val userAction = DBAccess.userTable.insertOrUpdate(users)
    val f = DBAccess.db.run(DBIO.seq(userAction))
    Await.result(f, Duration.Inf)        
}

但是我 运行 多个数据库查询。所以我在寻找一些方法来只调用一个 db.run。 所以我写了类似下面的东西

val userQuery = TableQuery[dbuserTable]
for(user<-x.userList)
{ 
    val users = userClass(user.name,user.id)
    userQuery += users                  
}
val f = DBAccess.db.run(DBIO.seq(userQuery.result))
Await.result(f, Duration.Inf)

然而,第二个片段没有写入数据库。有人可以指出我哪里出错了吗?

+= 不会改变您的 userQuery。 for 循环的每次迭代都会创建一个插入操作,然后立即将其丢弃。

尝试累积插入操作而不是丢弃它们(注意 yield 的使用):

val usersTable = TableQuery[dbuserTable]
val inserts = for (user <- x.userList) yield { 
  val userRow = userClass(user.name, user.id)
  usersTable += userRow                  
}
DBAccess.db.run(DBIO.seq(inserts: _*))

我知道这个老问题了,但由于我刚刚遇到它,所以我会为此提供更新的答案。

您可以使用 ++= 插入列表。

val usersTable = TableQuery[dbuserTable]
val listToInsert = x.userList.map(userClass(_.name, _.id))
val action = usersTable ++= listToInsert
DBAccess.db.run(action)

这只会执行一次插入所有内容的请求。