我使用了从光滑的代码生成器生成的代码。
我的表格超过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 功能。我该怎么做?
谢谢
答案 0 :(得分:0)
; TLDR; 不可能
<强>解释强>
Slick有两个抽象级别:Query
和DBIOAction
s。
当您处理Query
时,您必须访问您的架构定义和行Rep
s,并且基本上它受到限制,因为它&#39 ; s对您正在使用的实际数据库的最接近抽象级别。 Rep
是指数据库中的假设值,而不是程序中的假设值。
然后你有DBIOActions,它是下一个级别......不仅仅是查询的一些定义,而是它的执行。从查询中获取信息时通常会获得DBIOAction
,例如使用result
方法或(TADAN!)插入行时。
Insert
和Update
s不是查询,因此您无法尝试执行的操作。您正在处理DBIOAction(+=
方法)和Query
内容(Rep
类型)。在DBIOAction中获取Rep的唯一方法是执行Query并获取DBIOAction,然后使用flatMap
或使用comprehension(相同)组合两个Actions。