Удаление не работает в Play! 2.4, Slick 3 и PostgreSQL

Я прочитал это сообщение SO: Play 2.4 - Slick 3.0 .0 - УДАЛИТЬ не работает

но, похоже, в моем случае это не работает.

Мне удается вставить или получить данные из моей PostgreSQL (9.1) базы данных в моем Play! 2.4 приложении, но мне не удается выполнить некоторые удаления.

Вот очень простой код моего контроллера:

package controllers

import javax.inject.Inject
import play.api.db.slick.DatabaseConfigProvider
import play.api.mvc._
import slick.driver.JdbcProfile
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import slick.driver.PostgresDriver.api._
import models.Address

class Application @Inject()(dbConfigProvider: DatabaseConfigProvider) extends Controller {
  val dbConfig = dbConfigProvider.get[JdbcProfile]
  import dbConfig._
  import dbConfig.driver.api._

  def index = Action.async {
    db.run(addresses.filter(_.id === 1L).delete) map { res =>
      Ok(Json.toJson(res))
    }
  }
}

и моя модель Address:

case class Address(id: Option[Long], city: String)

object Address {

  class Addresses(tag: Tag) extends Table[Address](tag, "addresses") {
    def id = column[Long]("addressid", O.PrimaryKey, O.AutoInc)
    def city = column[String]("city")

    def * = (id.?, city) <>
      ((Address.apply _).tupled, Address.unapply)
  }

  lazy val addresses = TableQuery[Addresses]
}

Я получаю ошибку компиляции: value delete is not a member of slick.lifted.Query[models.Address.Addresses,models.Address.Addresses#TableElementType,Seq]

Я подозреваю, что это происходит из-за импорта, но я много чего пробовал без каких-либо улучшений.


person Simon    schedule 01.10.2015    source источник
comment
Не могли бы вы описать вашу ошибку? Это компиляция, исключение нулевого указателя, неожиданное поведение, бобры, грызущие ваши кабели Ethernet, что-то еще?   -  person Aldo Stracquadanio    schedule 01.10.2015
comment
Ой, я отредактировал свой пост.   -  person Simon    schedule 01.10.2015


Ответы (1)


Я подозреваю, что проблема в том, что вы дважды импортируете имплициты, необходимые для функции delete, тем самым создавая двусмысленность и заставляя компилятор отказаться от этого:

import slick.driver.PostgresDriver.api._
import dbConfig.driver.api._

В любом случае вам, вероятно, не понадобится один из двух, если вы пытаетесь быть универсальным (например, потому что вы хотите запускать тесты через H2), попробуйте удалить импорт PostgresDriver. Если это не сработает, попробуйте удалить внутренний импорт и оставить PostgresDriver в качестве связанного сообщения SO, которое, похоже, предполагает, что delete не был (есть?) Не в общем API.

person Aldo Stracquadanio    schedule 01.10.2015
comment
Действительно, удаление внутреннего импорта dbConfig.driver.api._ решает проблему, спасибо! - person Simon; 01.10.2015