如何在 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 中有两个抽象级别:Querys 和 DBIOActions。

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

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

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

【讨论】:

以上是关于如何在 slick 3.0 中将 Rep[T] 转换为 T?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-slick 中将类添加到 li 标签

Scala Slick 将 Rep 子查询组合成一个 re

如何使用 Slick 在 Postgres 中将 json 对象插入到 jsonb 类型的列中

使用 Slick 3.0 在同一事务中进行多次插入

Play 2.4 中的 Slick 3.0 事务

Slick 3.0 批量插入或更新(更新插入)