gpt4 book ai didi

scala - 无法使用Slick更新记录

转载 作者:行者123 更新时间:2023-12-04 13:51:51 26 4
gpt4 key购买 nike

类和表的定义如下所示:

case class Group(
id: Long = -1,
id_parent: Long = -1,
label: String = "",
description: String = "")

object Groups extends Table[Group]("GROUPS") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def id_parent = column[Long]("ID_PARENT")
def label = column[String]("LABEL")
def description = column[String]("DESC")
def * = id ~ id_parent ~ label ~ design <> (Group, Group.unapply _)
def autoInc = id_parent ~ label ~ design returning id into {
case ((_, _, _), id) => id
}
}

要更新记录,我可以这样做:
  def updateGroup(id: Long) = Groups.where(_.id === id)

def updateGroup(g: Group)(implicit session: Session) = updateGroup(g.id).update(g)

但是我无法使用表达式进行更新:
  val findGById = for {
id <- Parameters[Long]
g <- Groups; if g.id === id
} yield g

def updateGroupX(g: Group)(implicit session: Session) = findGById(g.id).update(g)
----------------------------------------------------------------------------^
Error: value update is not a member of scala.slick.jdbc.MutatingUnitInvoker[com.exp.Group]

我显然在 the documentation.中缺少了一些东西

最佳答案

update方法由 UpdateInvoker 类型提供。如果它们在范围内,则可以使用Query和/或productQueryToUpdateInvoker(可在 tableQueryToUpdateInvoker 中找到)从BasicProfile隐式创建该类型的实例。

现在,您的findById方法的类型不是Query而是BasicQueryTemplate[Long, Group]。看一下文档,我找不到从BasicQueryTemplate(这是StatementInvoker的子类型)到UpdateInvoker的任何方法,无论是隐式的还是显式的。考虑一下,这对我来说很有意义,因为我知道查询模板(调用程序)是已经在参数化之前的很早就从抽象语法树(Query)“编译”到准备好的语句的东西,而只能从抽象语法树(即Query对象)构建更新调用程序,因为它需要分析查询并提取其参数/列。至少这就是目前看来的工作方式。

考虑到这一点,一个可能的解决方案得以展现:

def findGById(id: Long) = for {
g <- Groups; if g.id === id
} yield g

def updateGroupX(g: Group)(implicit session: Session) = findGById(g.id).update(g)

其中 findById(id: Long)具有 Query[Groups, Group]类型,该类型由 productQueryToUpdateInvoker转换为 UpdateInvoker[Group],最终可以在其上调用 update方法。

希望这对您有所帮助。

关于scala - 无法使用Slick更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com