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 时要了解的重要一点是,几乎所有东西都是基于宏的,如果你把东西抽象掉,那么就没有足够的信息让这些宏起作用。因此,您要么需要复制需要宏的代码,要么将本应通用的代码包装在您自己的宏中。
我正在尝试将广义 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 时要了解的重要一点是,几乎所有东西都是基于宏的,如果你把东西抽象掉,那么就没有足够的信息让这些宏起作用。因此,您要么需要复制需要宏的代码,要么将本应通用的代码包装在您自己的宏中。