Scala 从选择滑动插入
我使用scala 2.11和slick 2.1.0,并有一个编译代码:Scala 从选择滑动插入,scala,slick,Scala,Slick,我使用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")
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)))
它起作用了
但我需要这样一个案例类:
case类SegmentClient(segmentId:Int,clientId:Long)
trait TSegmentClient{this:Profile=>
导入profile.simple_
类SegmentClient(标记:标记)扩展表[SegmentClient](标记,“seg”){
def段id=列[Int](“段id”)
def clientId=列[Long](“客户端id”)
def*=(segmentId,clientId)(SegmentClient.tuple,SegmentClient.unapply)
}
}
segmentClients.insert(clientBehaviors.map(c=>(1,c.clientId)))
但它没有编译
(值:models.coper.datamining.SegmentClient)(隐式会话:
无法将scala.slick.jdbc.jdbcbbackend#SessionDef)Int应用于
(scala.slick.lifted.Query[(scala.slick.lifted.Column[Int],
scala.slick.lifted.Column[Long],(Int,Long),Seq])
插入(clientBehaviors.map(c=>(segmentId,c.clientId)))
我的代码有什么问题?第二个示例中
segmentClients
上的insert
方法需要一个SegmentClient
实例,因为segmentClients
是一个实例。这就是编译器错误消息的基本意思。我不知道是否有更惯用的方法,因为我不太了解Slick,但作为一种解决方法,您也可以使用:
val behaviours = clientBehaviours.list.map(c => SegmentClient(1, c.clientId))
segmentClients.insertAll(behaviours)
您可以使用对未映射到case类的元组的另一个投影来实现这一点
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)))
case类SegmentClient(segmentId:Int,clientId:Long)
trait TSegmentClient{this:Profile=>
导入profile.simple_
类SegmentClient(标记:标记)扩展表[SegmentClient](标记,“seg”){
def段id=列[Int](“段id”)
def clientId=列[Long](“客户端id”)
def tuple=(segmentId,clientId)
def*=元组(SegmentClient.tuple,SegmentClient.unapply)
}
}
segmentClients.map(u.tuple).insert(clientBehaviors.map(c=>(1,c.clientId)))
您的代码未编译,我可以这样做:for(c段客户机需要Int,Long,但c.clientId是scala.slick.lifted.Column[Long]为c.clientId
设置列
意味着您仍然在查询中,但是列表
应该返回列表
,该列表是clientBehavior
表映射到的任何对象。您是否也可以发布clientBehavior
的实际类型。也许我遗漏了一些内容,但看起来好像您错过了什么没有调用list
。您是否已经尝试了cvogt的建议?def tuple=(segmentId,clientId);def*=tuple(SegmentClient.tuple,SegmentClient.unapply)和SegmentClient.tuple.insert(…)?抱歉,我不明白。在我的示例2中,我需要更改def*=(segmentId,clientId)(SegmentClient.tuple,SegmentClient.unapply)
totuple=(segmentId,clientId);def*=tuple(SegmentClient.tuple,SegmentClient.unapply)
然后执行segmentClients.tuple.insert(clientBehaviors.map(c=>(1,c.clientId)))
?编译器说,值元组不是scala.slick.lifted.tablequery的成员。我错了,请使用:segmentClients.map(u.tuple)。insert(…)Greate!它可以工作,谢谢!请添加您的答案,这样我就可以标记itHey@cvogt。在slick 3+中,正确的方法是什么?请尝试forceInsertQuery。请参阅本文的最后一部分
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)))