Phantom dsl 2.24 таблицы не создаются

Недавно пытаюсь перейти на последнюю фантомную версию 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 и распечатал "Готово". Тем не менее, таблица никогда не создается. Также нет исключений или предупреждений. Ничего не сделал Я пытался остановить локальную базу данных кассандры. Код бросает 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.

1 ответ

Вы не используете правильный метод DSL для создания таблиц, посмотрите официальное руководство. Все это table.create делает, чтобы создать пустой CreateQueryи вы принуждаете возвращаемый тип к Unit вручную.

Включен метод создания автоматической блокировки Database, а не на столе, так что вы хотите, это:

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() метод, который вызовет любое действие в базе данных, в противном случае вы просто строите запрос, не выполняя его. Название метода может ввести в заблуждение, и мы улучшим документы и будущие выпуски, чтобы сделать его более понятным.

Конфликт с игрой 2.6.9 выглядит очень странно, вполне возможно, что за кулисами есть несовместимая зависимость, связанная с компиляцией макросов. Поднимите это как отдельный вопрос, и мы определенно сможем взглянуть на него.

Другие вопросы по тегам