如何在 slick 3.0 中将 Rep[T] 转换为 T?
Posted
技术标签:
【中文标题】如何在 slick 3.0 中将 Rep[T] 转换为 T?【英文标题】:How to convert Rep[T] to T in slick 3.0? 【发布时间】:2015-07-24 14:56:55 【问题描述】:我使用了一个从 slick 代码生成器生成的代码。
我的表有超过 22 列,因此它使用 HList
它生成1个类型和1个函数:
type AccountRow
def AccountRow(uuid: java.util.UUID, providerid: String, email: Option[String], ...):AccountRow
如何从生成的代码编写编译后的插入代码?
我试过了:
val insertAccountQueryCompiled =
def q(uuid:Rep[UUID], providerId:Rep[String], email:Rep[Option[String]], ...) = Account += AccountRow(uuid, providerId, email, ...)
Compiled(q _)
我需要将 Rep[T]
转换为 T
才能使 AccountRow 函数正常工作。我该怎么做?
谢谢
【问题讨论】:
你能找到答案吗? 这可能会有所帮助:***.com/questions/21422394/… 【参考方案1】:;TLDR;不可能
说明
Slick 中有两个抽象级别:Query
s 和 DBIOAction
s。
当您处理Query
s 时,您必须访问您的架构定义和行,Rep
s,而且基本上,它非常受限制,因为它是最接近您实际数据库的抽象级别使用。 Rep
指的是数据库中的假设值,而不是您的程序中的值。
然后你有 DBIOActions,它是下一个级别......不仅仅是查询的一些定义,而是它的执行。从查询中获取信息时,您通常会得到 DBIOAction
s,例如使用 result
方法或(TADAN!)插入行时。
Insert
s 和 Update
s 不是查询,因此您尝试执行的操作是不可能的。您正在处理 DBIOAction(+=
方法)和Query
东西(Rep
类型)。在 DBIOAction 中获取 Rep 的唯一方法是执行 Query 并获取 DBIOAction,然后使用 flatMap
或 for comprehensions(相同)组合两个 Action。
【讨论】:
以上是关于如何在 slick 3.0 中将 Rep[T] 转换为 T?的主要内容,如果未能解决你的问题,请参考以下文章