来自 select 的流畅插入
Slick insert from select
我使用 scala 2.11 和 slick 2.1.0 并且有编译代码:
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[(Int, Long)](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def * = (segmentId, clientId)
}
}
segmentClients.insert(clientBehaviors.map(c => (1, c.clientId)))
有效。
但我需要这样一个案例 class:
case class SegmentClient(segmentId: Int, clientId: Long)
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[SegmentClient](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def * = (segmentId, clientId) <> (SegmentClient.tupled, SegmentClient.unapply)
}
}
segmentClients.insert(clientBehaviors.map(c => (1, c.clientId)))
但它无法编译。
(value: models.coper.datamining.SegmentClient)(implicit session:
scala.slick.jdbc.JdbcBackend#SessionDef)Int cannot be applied to
(scala.slick.lifted.Query[(scala.slick.lifted.Column[Int],
scala.slick.lifted.Column[Long]),(Int, Long),Seq])
segmentClients.insert(clientBehaviors.map(c => (segmentId, c.clientId)))
我的代码有什么问题?
第二个示例中 segmentClients
上的 insert
方法需要一个 SegmentClient
实例,因为 SegmentClients
是一个 mapped table。这就是编译器错误消息的基本含义。我不知道是否有更惯用的方法,因为我不太了解 Slick,但作为一种解决方法,您还可以使用:
val behaviours = clientBehaviours.list.map(c => SegmentClient(1, c.clientId))
segmentClients.insertAll(behaviours)
您可以对未映射到案例的元组使用另一个投影来执行此操作 class。
case class SegmentClient(segmentId: Int, clientId: Long)
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[SegmentClient](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def tuple = (segmentId, clientId)
def * = tuple <> (SegmentClient.tupled, SegmentClient.unapply)
}
}
segmentClients.map(_.tuple).insert(clientBehaviors.map(c => (1, c.clientId)))
我使用 scala 2.11 和 slick 2.1.0 并且有编译代码:
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[(Int, Long)](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def * = (segmentId, clientId)
}
}
segmentClients.insert(clientBehaviors.map(c => (1, c.clientId)))
有效。
但我需要这样一个案例 class:
case class SegmentClient(segmentId: Int, clientId: Long)
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[SegmentClient](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def * = (segmentId, clientId) <> (SegmentClient.tupled, SegmentClient.unapply)
}
}
segmentClients.insert(clientBehaviors.map(c => (1, c.clientId)))
但它无法编译。
(value: models.coper.datamining.SegmentClient)(implicit session: scala.slick.jdbc.JdbcBackend#SessionDef)Int cannot be applied to (scala.slick.lifted.Query[(scala.slick.lifted.Column[Int], scala.slick.lifted.Column[Long]),(Int, Long),Seq]) segmentClients.insert(clientBehaviors.map(c => (segmentId, c.clientId)))
我的代码有什么问题?
第二个示例中 segmentClients
上的 insert
方法需要一个 SegmentClient
实例,因为 SegmentClients
是一个 mapped table。这就是编译器错误消息的基本含义。我不知道是否有更惯用的方法,因为我不太了解 Slick,但作为一种解决方法,您还可以使用:
val behaviours = clientBehaviours.list.map(c => SegmentClient(1, c.clientId))
segmentClients.insertAll(behaviours)
您可以对未映射到案例的元组使用另一个投影来执行此操作 class。
case class SegmentClient(segmentId: Int, clientId: Long)
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[SegmentClient](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def tuple = (segmentId, clientId)
def * = tuple <> (SegmentClient.tupled, SegmentClient.unapply)
}
}
segmentClients.map(_.tuple).insert(clientBehaviors.map(c => (1, c.clientId)))