如何在光面3.0中将Rep [T]转换为T?

时间:2015-05-13 10:57:13

标签: slick slick-3.0

我使用了从光滑的代码生成器生成的代码。

我的表格超过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 功能。我该怎么做?

谢谢

1 个答案:

答案 0 :(得分:0)

; TLDR; 不可能

<强>解释

Slick有两个抽象级别:QueryDBIOAction s。

当您处理Query时,您必须访问您的架构定义和行Rep s,并且基本上它受到限制,因为它&#39 ; s对您正在使用的实际数据库的最接近抽象级别。 Rep是指数据库中的假设值,而不是程序中的假设值。

然后你有DBIOActions,它是下一个级别......不仅仅是查询的一些定义,而是它的执行。从查询中获取信息时通常会获得DBIOAction,例如使用result方法或(TADAN!)插入行时。

InsertUpdate s不是查询,因此您无法尝试执行的操作。您正在处理DBIOAction(+=方法)和Query内容(Rep类型)。在DBIOAction中获取Rep的唯一方法是执行Query并获取DBIOAction,然后使用flatMap或使用comprehension(相同)组合两个Actions。