результат кортежа в пятно 3 DBIO - PullRequest
0 голосов
/ 10 мая 2018

Есть таблица с ключом, значениями.

Есть еще одна таблица с автоматическим увеличением PK.

Возьмите значение для ключа из первой таблицы. Если нет, вставьте и вернуть значение по умолчанию. Запросить другую таблицу на его основе.

Возвращает отфильтрованный результат и значение.

Чтобы я мог попробовать:

def lastLogs(limit: Long = 666): Future[(Long, Seq[VLogEntry])] = {
  val q: DBIO[(Long, Seq[VLogEntry])] = {
    for {
      existing <- kvTable.filter(_.key === "log").result.headOption
      conf = existing getOrElse KV(key = "log", value = "0")
      last = conf.value.toLong
      rds = vLogTable.filter(_.id > last).take(limit).result
      _ <- kvTable.insertOrUpdate(conf)
    } yield {
      (last, rds)
    }
  }
  db.run(q)
}

Это дает ошибку компиляции:

found   : HipDAO.this.domain.dbConfig.profile.StreamingProfileAction[Seq[HipDAO.this.domain.VLogTable ...

required: Seq[db.types.Types.VLogEntry]

В Slick 2 я мог бы вызвать список или привести к запросам в сессии. Как мне это сделать в Slick 3.

1 Ответ

0 голосов
/ 10 мая 2018

Проходя итерации того, что можно было сделать, я пришел к:

def lastLogs(limit: Long = 666): Future[(Long, Seq[VLogEntry])] = {
  val q: DBIO[(Long, Seq[VLogEntry])] = {
    for {
      existing <- kvTable.filter(_.key === "log").result.headOption
      conf = existing getOrElse KV(key = "log", value = "0")
      _ <- kvTable.insertOrUpdate(conf)
      last = conf.value.toLong
      rds <- vLogTable.filter(_.id > last).take(limit).result
    } yield {
      (last, rds)
    }
  }
  db.run(q)
}

Поскольку разница составляет всего 2 символа, это кажется простым исправлением. Интернет лишен того, что StreamingProfileAction и как читать эти сообщения. Некоторое понимание может прийти от чтения эфирного пятна 3

В конце концов, как я это увидел, это монада, вы должны сделать это.

...