在 Slick 3 中,SQL-如何使用映射大小写 class 编译插入?

In Slick 3, how does one SQL-Compile an insert using a mapped case class?

要SQL-编译一个查询,您需要编译一个函数,它为每个查询参数arg: type接受一个Rep[type]类型的提升参数。

我有一个案例 class JobRecord 和一个 TableQuery jobRecords

所以要插入一个 JobRecord case-class 实例,我需要能够说出如下内容:

val qMapToId = (jobRecords returning jobRecords.map(_.id))
def ucCreate(jobRecord: Rep[JobRecord]) = qMapToId += jobRecord
val cCreate = Compiled(ucCreate _)

但是当然这不会编译,因为 += 不接受 Rep,而且我不确定 Rep[JobRecord] 是否有效。

我尝试了很多东西,但不值得展示,包括混入 Monomorphic Case Classes 指导。我可能有几次远离解决方案。指向工作示例的指针会很棒!

您无需执行任何操作,val qMapToId = (jobRecords returning jobRecords.map(_.id)) 会在编译时(即在容器启动时)生成一次语句。

Compiled 替换了新 API 中的 Parameters,并开始用于选择、更新和(我相信)删除您绑定占位符以生成准备好的语句的位置.对于插入语句,没有什么可以绑定的,您已经有了 +=.

的实例

您可以按如下方式使用 TableQuery[]。

# define TableQuery of JobRecord
case class JobRecordRow(...)
class JobRecord(tag:Tag) extends Table[JobRecordRow](tag, "JOB_TABLE_NAME") {
}
# define compiled query
val insert = Compiled( TableQuery[JobRecord].filter(_ => true:Rep[Boolean]))
val stmt = (insert += JobRecordRow(...))
db.run( stmt)

编译查询似乎有点棘手。但是,当我按照其他文章中的建议尝试 Compiled(TableQuery[JobRecord]) 时,它没有用。通过添加 filter(),我可以构建插入查询。

更新于 2019-07-21

代替filter(),可以使用map(identity)

TableQuery[JobRecord].map(identity)