我试图使用Couchbase作为缓存层来访问使用Slick的关系数据库。我的代码与问题相关的框架如下:使用Couchbase作为Slick的缓存
class RdbTable[T <: Table[_]](implicit val bucket: CouchbaseBucket) {
type ElementType = T#TableElementType
private val table = TableQuery[T].baseTableRow
private def cacheAll(implicit session: Session) =
TableQuery[T].list foreach (elem => cache(elem))
private def cache(elem: ElementType) =
table.primaryKeys foreach (pk => bucket.set[ElementType](key(pk, elem), elem))
private def key(pk: PrimaryKey, elem: ElementType) = ???
.......
}
正如您所看到的,我想通过它的所有主键缓存每个元素。为此,我需要获取给定元素的该键的值。但是我没有看到计算主键值的明显方式(列值,如果是单列键;元组值,如果是多列)。
关于怎么做的任何建议?请注意,代码不能知道实际的表和它们的列是什么。它必须是完全一般的。
谢谢,Zim-Zam!是的,我想我可以混合使用声明的密钥(),并在每个具体表类中定义它 - 然后跳过一些环来调用它,因为T被定义为扩展表[_] 。不是最好的解决方案,但肯定可行。然而,我的直觉告诉我,这不应该是必要的。 PrimaryKey对象知道它由哪些列组成,并且T#TableElementType行知道它的值,所以应该可以将它投影到主键列上。有多奇怪,似乎没有简单的程序化方式来做到这一点!或者在那里? –
silverberry
2014-09-24 14:14:47