gpt4 book ai didi

scala - 在 Slick 3.0 中,如何从查询到案例类?

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

我正在尝试在 Scala 应用程序中使用 Slick 作为数据库,并且遇到了一些关于如何查询(查找)并将结果转换为案例类的问题(或我的误解)。

我没有映射案例类,而是映射实际值,目的是即时创建案例类。所以,我的表是:

object Tables {

class Names(tag: Tag) extends Table[Name](tag, "NAMES") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def first = column[String]("first")
def middle = column[String]("last")
def last = column[String]("last")

def * = (id.?, first, middle.?, last) <> ((Name.apply _).tupled, Name.unapply)
}

object NamesQueries {

lazy val query = TableQuery[Names]

val findById = Compiled { k: Rep[Long] =>
query.filter(_.id === k)
}
}
}

这是查询:
object NamesDAO {

def insertName(name: Name) {
NamesQueries.query += name.copy(id = None)
}

def findName(nameId: Long) = {
val q = NamesQueries.findById(nameId) // AppliedCompiledFunction[Long, Query[Tables.Names, Tables.Names.TableElementType, Seq],Seq[Tables.Names.TableElementType]]
val resultSeq = Database.forConfig("schoolme").run(q.result) // Future[Seq[Tables.Names.TableElementType]]
val result = resultSeq.map { r => // val result: Future[(Option[Long], String, Option[String], String) => Name]
val rr = r.map{ name => // val rr: Seq[(Option[Long], String, Option[String], String) => Name]
Name.apply _
}
rr.head
}
result
}
}

然而, findName 方法似乎返回 Future((Option[Long], String, Option[String], String) => Name)而不是 Future(Name) .我究竟做错了什么?是否只是使用 asInstanceOf[Name] 的问题? ?

编辑:正如 sap1ens 所建议的那样,将 findName 扩展为较小的块,并为每个块添加注释。

最佳答案

好吧,我会被诅咒的。
在上面的 sap1ens 评论之后,我将 findName 分解为多个步骤(并编辑了问题)。但在那之后,我回去给了我的 val 一个明确的类型,这奏效了。看这里:

  def findName(nameId: Long) = {
val q = NamesQueries.findById(nameId)
val resultSeq: Future[Seq[Name]] = Database.forConfig("schoolme").run(q.result)
val result = resultSeq.map { r =>
val rr = r.map{ name =>
name
}
rr.head
}
result
}

所以,这次类型推断是 (/my) 的罪魁祸首。记住,记住。

关于scala - 在 Slick 3.0 中,如何从查询到案例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736691/

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