Получить значения из запроса Slick 2.0 в форме класса case

Я пытаюсь получить классы базовых запросов из запроса Scala Slick, и мне это кажется более сложным, чем должно быть. Вот моя ошибка компилятора:

[info] Compiling 18 Scala sources to /home/target/scala-2.11/classes... [error] /home/src/main/scala/com/core/address/AddressDAO.scala:30: type mismatch; [error] found : scala.slick.lifted.Query[com.core.address.AddressDAO,com.core.protocol.Address,Seq] [error] required: Option[com.core.protocol.Address] [error] q

Вот метод, который я написал:

  def getAddress(otherAddress: String): Future[Option[Address]] = {
    future {
      val q = for (addr <- addresses if (addr.address == otherAddress)) yield addr
      q
    }

Вот схема Slick:

class AddressDAO(tag: Tag) extends Table[Address](tag, "ADDRESSES") with DbConfig {

  def address = column[String]("ADDRESS", O.PrimaryKey)
  def hash160 = column[String]("HASH160")
  def n_tx = column[Long]("N_TX")
  def total_received = column[Double]("TOTAL_RECEIVED")
  def total_sent = column[Double]("TOTAL_SENT")
  def final_balance = column[Double]("FINAL_BALANCE")
  def * = (hash160, address, n_tx, total_received, total_sent, final_balance) <> (Address.tupled, Address.unapply)

}

То, что я хочу сделать, выражается в возвращаемом типе метода getAddress, который равен Future[Option[Address]]. Мне нужен первый элемент, который находит база данных. Фактически возвращаемый тип имеет тип scala.slick.lifted.Query[com.core.address.AddressDAO,com.core.protocol.Address,Seq].

Кажется, нет никакого execute метода или чего-то еще, чтобы запустить запрос. Я подозреваю, что это можно сделать с помощью for-comprehensions, но я не могу понять, как это сделать на самом деле.

Спасибо!


person Chris Stewart    schedule 27.11.2014    source источник


Ответы (2)


Я, конечно, не эксперт по Slick, но после беглого прочтения документов , мне интересно, сработает ли обертка чего-то подобного в вашем Future:

addresses.filter(_.address === "givenAddressString").firstOption
person Vidya    schedule 27.11.2014
comment
Не нашли под этим документом? slick.typesafe.com/ документ/2.0.0-M3/api/ - person Chris Stewart; 27.11.2014
comment
Во-первых, я думаю, что это устарело, так как 2.0.0 больше не является вехой и на самом деле является вещью. Но вы также должны посмотреть на Invoker . Как говорится в документации, запросы выполняются с использованием методов, определенных в трейте Invoker (или UnitInvoker для версий без параметров). Существует неявное преобразование из Query, поэтому вы можете выполнить любой Query напрямую. - person Vidya; 27.11.2014
comment
Спасибо, это был мой разрыв :) - person Chris Stewart; 27.11.2014
comment
Рад помочь. Удачи тебе с твоим проектом! - person Vidya; 27.11.2014

Вы должны фактически запустить свой запрос.

q.firstOption - это то, что вы, вероятно, захотите использовать:

def getAddress(otherAddress: String): Future[Option[Address]] = {
    future {
      val q = for (addr <- addresses if (addr.address == otherAddress)) yield addr
      q.firstOption
    }

PS. Простая фильтрация адресов для заданного значения адреса действительно более лаконична. И, конечно же, производительность этого запроса зависит от того, есть ли у вас индекс для этого поля и размер вашей таблицы :)

person Ashalynd    schedule 27.11.2014