27

我使用了一个代码,它是从 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]AccountRow函数才能工作T。我怎么做?

谢谢

4

1 回答 1

1

;TLDR; 不可能

解释

Slick 中有两个抽象级别:Querys 和DBIOActions。

当您处理Querys 时,您必须访问您的模式定义和行,Reps 并且基本上,它非常受限制,因为它是与您正在使用的实际 DB 最接近的抽象级别。ARep指的是数据库中的假设值,而不是您的程序中的值。

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

Inserts 和Updates 不是查询,因此您尝试执行的操作是不可能的。您正在处理 DBIOAction (+=方法)和Query东西(Rep类型)。在 DBIOAction 中获取 Rep 的唯一方法是执行 Query 并获取 DBIOAction,然后使用flatMap或 for 理解(这是相同的)组合两个操作。

于 2018-04-13T07:37:48.670 回答