[英]Using Phantom 2 with an existing Cassandra session
我正在尝试将我们当前的实现从Phantom 1.28.16迁移到2.16.4,但我遇到了设置问题。
我们的框架在启动期间为我们提供了Cassandra会话对象,它似乎不适合Phantom。 我试图让Phantom接受已经实例化的会话,而不是通过常规的CassandraConnection对象。
我假设我们不能使用Phantom Database类,但是我希望仍然有一些方法可以在不使用该类的情况下设置和使用Table。
这可行吗?
我最终做了以下工作,以便能够将Phantom与现有连接一起使用:
定义了一个新的特性PhantomTable,用来代替Phantoms'Table'的特性。 除了删除RootConnector之外,它们是相同的
trait PhantomTable[T <: PhantomTable[T, R], R] extends CassandraTable[T, R] with TableAliases[T, R]
通过扩展PhantomTable特征并将其设置为一个对象来定义我的表。 在这里,我必须导入所有TableHelper宏以使其进行编译
...
import com.outworkers.phantom.macros.TableHelper._
final case class Foo(id: String, name: Option[String])
sealed class FooTable extends PhantomTable[FooTable, Foo] {
override val tableName = "foo"
object id extends StringColumn with PartitionKey
object name extends OptionalStringColumn
}
object FooTable extends FooTable
之后,只要在范围内存在隐式Keyspace和Session,就可以在FooTable对象上使用所有想要的方法。
这是一个简单的主程序,显示了如何使用表
object Main extends App {
val ks = "foo_keyspace"
val cluster = Cluster.builder().addContactPoints("127.0.0.1").build()
implicit val keyspace: KeySpace = KeySpace(ks)
implicit val session: Session = cluster.connect(ks)
val res = for {
_ <- FooTable.create.ifNotExists.future
_ <- FooTable.insert.value(_.id, "1").value(_.name, Some("data")).future
row <- FooTable.select.where(_.id eqs "1").one
} yield row
val r = Await.result(res, 10.seconds)
println(s"Row: $r")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.