【问题标题】:Phantom dsl 2.24 tables are not created未创建 Phantom dsl 2.24 表
【发布时间】:2018-09-18 22:09:03
【问题描述】:

最近尝试迁移到最新的 phantom 版本 2.24.8。我创建了一个虚拟项目,但遇到了一些我无法弄清楚的问题。这是我的代码:

import com.outworkers.phantom.connectors.{CassandraConnection, ContactPoints}
import com.outworkers.phantom.database.Database

import scala.concurrent.Future
import com.outworkers.phantom.dsl._

case class Test(id: String, timestamp: String)

abstract class Tests extends Table[Tests, Test] {

  object id extends StringColumn with PartitionKey

  object timestamp extends StringColumn with ClusteringOrder
}

abstract class ConcreteTests extends Tests with RootConnector {
  def addTest(l: Test): Future[ResultSet] = {
    //    store(l).consistencyLevel_=(ConsistencyLevel.LOCAL_ONE).future
    insert.value(_.id, l.id)
      .value(_.timestamp, l.timestamp)
      .consistencyLevel_=(ConsistencyLevel.QUORUM).future
  }

}

class MyDB(override val connector: CassandraConnection) extends Database[MyDB](connector) {

  object tests extends ConcreteTests with connector.Connector

  def init(): Unit = {
    tests.create
  }
}

object Test{
  def main(args: Array[String]): Unit = {
    val db = new MyDB(ContactPoints(Seq("127.0.0.1")).keySpace("tests"))
    db.init
    db.tests.addTest(Test("1", "1323234234"))
    println("Done")
  }
}

它在 IntelliJ 中编译并运行并打印出“完成”。但是,从未创建任何表。也没有异常或警告。它什么也没做。我试图停止本地 cassandra 数据库。代码抛出NoHostAvailableException。所以它确实会尝试连接本地数据库。有什么问题?

另一个奇怪的事情是“com.typesafe.play”%%“play-json”%“2.6.9”在我的build.sbt中。如果我删除该库,相同的代码会引发以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/reflect/runtime/package$
    at com.outworkers.phantom.column.AbstractColumn.com$outworkers$phantom$column$AbstractColumn$$_name(AbstractColumn.scala:55)
    at com.outworkers.phantom.column.AbstractColumn.com$outworkers$phantom$column$AbstractColumn$$_name$(AbstractColumn.scala:54)
    at com.outworkers.phantom.column.Column.com$outworkers$phantom$column$AbstractColumn$$_name$lzycompute(Column.scala:22)
    at com.outworkers.phantom.column.Column.com$outworkers$phantom$column$AbstractColumn$$_name(Column.scala:22)
    at com.outworkers.phantom.column.AbstractColumn.name(AbstractColumn.scala:58)
    at com.outworkers.phantom.column.AbstractColumn.name$(AbstractColumn.scala:58)
    at com.outworkers.phantom.column.Column.name(Column.scala:22)
    at com.outworkers.phantom.builder.query.InsertQuery.value(InsertQuery.scala:107)

真的无法弄清楚发生了什么。有什么帮助吗?

顺便说一句,我使用的是 scala 2.12.6 和 JVM 1.8.181。

【问题讨论】:

    标签: scala phantom-dsl


    【解决方案1】:

    您没有使用正确的 DSL 方法来创建表,请查看 official guidetable.create 所做的只是创建一个空的CreateQuery,然后手动将返回类型强制为Unit

    自动阻塞创建方法是在Database上,而不是在table上,所以你想要的是:

    class MyDB(override val connector: CassandraConnection) extends Database[MyDB](connector) {
    
      object tests extends ConcreteTests with connector.Connector
    
      def init(): Unit = {
        this.create
      }
    }
    

    如果您想使用table 实现相同的目的,您需要:

    class MyDB(override val connector: CassandraConnection) extends Database[MyDB](connector) {
    
      object tests extends ConcreteTests with connector.Connector
    
      def init(): Unit = {
        import scala.concurrent.duration._
        import scala.concurrent.Await
    
        Await.result(tests.create.future(), 10.seconds)
      }
    }
    

    只有对future() 方法的调用才会触发对数据库的任何类型的操作,否则您只是在构建查询而不执行它。方法名称可能会造成混淆,我们将改进文档和未来版本以使其更加明显。

    与 play 2.6.9 的冲突​​看起来很奇怪,完全有可能在幕后存在不兼容的依赖关系与宏编译有关。将其作为一个单独的问题提出,我们绝对可以查看它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2020-05-04
      • 2016-10-10
      • 2018-02-22
      • 1970-01-01
      相关资源
      最近更新 更多