将Phantom 2与现有的Cassandra会话一起使用

时间:2017-12-01 15:26:19

标签: scala cassandra phantom-dsl

我正在尝试将当前的实施从Phantom 1.28.16迁移到2.16.4,但我遇到了设置问题。

我们的框架在启动期间为我们提供了Cassandra会话对象,它似乎不适合Phantom。我试图让Phantom接受已经实例化的会话,而不是通过常规的CassandraConnection对象。

我假设我们不能使用Phantom Database类,但是我希望仍然有一些方法可以在不使用该类的情况下设置和使用Table。

这可行吗?

1 个答案:

答案 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")
}