繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM