Scala, postgresql - problem z zapisem do bazy danych

Scala, postgresql - problem z zapisem do bazy danych
OV
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
0

Robię prostego cruda w scali, playu, z użyciem postgresql, ale za cholerę żadne dane nie chcą się zapisać do bazy. Połączenie tworzy się przy starcie apki, ale sam insert nie wyrzuca na konsole żadnych logów, ani nic się w tabeli nie zapisuje.
Dorzucam kod, jak ktoś może się na tym zna lepiej, albo się z czymś takim zetknął to proszę o pomoc.

application.conf

Kopiuj
db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost:5432/shop"
db.default.username="postgres"
db.default.password="root"
play.evolutions.enabled=true

product.scala (model i operacje crud'owe)

Kopiuj
case class Product(id: Option[Long], name: String, description: String, price: BigDecimal, amount: Int)

class ProductTableDef(tag: Tag) extends Table[Product](tag, "product") {

  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

  def name = column[String]("name")

  def description = column[String]("description")

  def price = column[BigDecimal]("price")

  def amount = column[Int]("amount")

  override def * =
    (id.?, name, description, price, amount) <> (Product.tupled, Product.unapply)
}

object Products {

  val products = TableQuery[ProductTableDef]

  private def db: Database = Database.forDataSource(DB.getDataSource())

  def add(product: Product): Future[Int] = {
    db.run(products += product)
  }

  def delete(id: Long): Future[Int] = {
    db.run(products.filter(_.id === id).delete)
  }

  def get(id: Long): Future[Option[Product]] = {
    db.run(products.filter(_.id === id).result.headOption)
  }

  def listAll: Future[Seq[Product]] = {
    db.run(products.result)
  }
}

service:

Kopiuj
 def addProduct(product: Product): Future[Int] = {
    Products.add(product)
  }

controller:

Kopiuj
def create() = Action(parse.json) { request =>
    val name = (request.body \ "name").as[String]
    val description = (request.body \ "description").as[String]
    val price = (request.body \ "price").as[BigDecimal]
    val amount = (request.body \ "amount").as[Int]

    val product = Product(None,name, description, price, amount)
    ProductService.addProduct(product)    
    Ok("name : " + product.name)
  }

Dodam, ze jest to restowy serwer, dane sysyłam json'em i sam obiekt Produkt się tworzy z tych danych. Problem jest później, przy insercie.
Wołam @Wibowit bo kojarze, że ogarnia scalę

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 3 godziny
3

Kod wygląda w miarę OK, więc dorobiłbym po prostu więcej debug logów samemu. Np w metodzie Products.add na początku dodałbym linię typu:
log.info("wchodzimy do Products.add")
a na samym wyniku db.run też bym zapiął loga, np:
ProductService.addProduct(product).foreach(count => log.info(s"wstawione wiersze: $count"))

Slick wyrzuca sporo logów, ale na poziomie DEBUG. Slick 3.2.0 wypisuje u mnie cały proces tworzenia zapytań, ich odpalanie i część wyników.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.