我正在尝试将当前的实施从Phantom 1.28.16迁移到2.16.4,但我遇到了设置问题。
我们的框架在启动期间为我们提供了Cassandra会话对象,它似乎不适合Phantom。我试图让Phantom接受已经实例化的会话,而不是通过常规的CassandraConnection对象。
我假设我们不能使用Phantom Database类,但是我希望仍然有一些方法可以在不使用该类的情况下设置和使用Table。
这可行吗?
答案 0 :(得分:0)
我最终执行了以下操作,以便能够将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")
}