5

I have the following code in Scala:

case class Product(id: Option[Long] = None, name: String, price: BigDecimal, description: String)

object Products extends Table[Product]("product") {
  def id = column[Long]("id", O.AutoInc, O.PrimaryKey)
  def name = column[String]("name", O.NotNull)
  def price = column[BigDecimal]("price", O.NotNull)
  def description = column[String]("description", O.NotNull)

  def * = id.? ~ name ~ price ~ description <>(Product.apply _, Product.unapply _)

  def autoInc = * returning id

  def add(product: Product)(implicit s:Session): Long = {
    Products.autoInc.insert(product)
  }

  def all(implicit s:Session): List[Product] = {
    Query(Products).list
  }
}

Listing all products works great, however, I can't make adding method working.

After calling:

val myProduct = models.Product(id = None, name = "test2", price = BigDecimal(2.99), description = "test3")
models.Products.add(myProduct)

I constanty get an error message from PostgreSQL saying that id cannot be null. I totally agree with that, but why the id column is not being set by autoInc? Doesn't it work that way?

I use Play! 2.1.2, Scala 2.10.0, PostgreSQL 9.3 and play-slick 0.3.3.

Thanks in advance.

Franco
  • 11,845
  • 7
  • 27
  • 33
oskario
  • 251
  • 2
  • 6
  • What's your schema? Was it created by slick or by hand? Likely, the id column needs to be type serial or bigserial, which really makes it type int or bigint, but also sets the default value to be nextval('product_id_seq'), and automatically creates that sequence. – Tim Jul 13 '13 at 21:21
  • It is created automatically by Slick: `create table "product" ("id" SERIAL NOT NULL PRIMARY KEY,"name" VARCHAR(254) NOT NULL,"price" DECIMAL(21,2) NOT NULL,"description" VARCHAR(254) NOT NULL);`. I think it is already SERIAL, but the code doesn't work :( – oskario Jul 13 '13 at 21:36

1 Answers1

5

Here is a suggestion, rewrite your autoInc and add methods like this:

def autoInc = name ~ price ~ description returning id

def add(product: Product)(implicit s:Session): Long = {
    Products.autoInc.insert(p.name, p.price, p.description)
}

Some databases own't allow you to insert null in the auto increment column. Maybe it's the Postgres case.

pedrofurla
  • 12,763
  • 1
  • 38
  • 49