Scala:Oracle JDBC 与 Quill 通用

Scala: Oracle JDBC generic with Quill

我正在尝试将广义 class 作为参数传递。如果我给 Case class 和值,那么它工作正常。但是,想让它通用。

class DB[T] {
  lazy val ctx = new OracleJdbcContext(SnakeCase, "ctx")

  import ctx._

  def insert(input: T) = {
    val q = quote {
      query[T].insert(lift(input))
    }
    ctx.run(q)

  }

}

我收到错误消息:: “找不到类型 T 的隐式 SchemaMeta 找不到类型 'T' 的编码器。请注意,编码器是不变的

但是,如果我给出实际的 class 名称,那么它会很顺利。

case class Location(street:String,pinCode:Int)

class DB {
  lazy val ctx = new OracleJdbcContext(SnakeCase, "ctx")
  import ctx._
  val q = quote {
      query[Location].insert(Location("2ndcross",500001))
    }
    ctx.run(q)

}

您需要在 SchemaMeta[T] 范围内才能使用此类型执行查询。虚拟解决方案是要求它作为参数约束(以及隐含的 class 参数),就像这样

class DB[T: SchemaMeta]

但这行不通,因为 ctx 提供了这些实例。

我相信您需要遵循此处显示的示例:https://getquill.io/#contexts-dependent-contexts 但即便如此,你想要的也可能无法实现。

使用 quill 时要了解的重要一点是,几乎所有东西都是基于宏的,如果你把东西抽象掉,那么就没有足够的信息让这些宏起作用。因此,您要么需要复制需要宏的代码,要么将本应通用的代码包装在您自己的宏中。