Mam następujący kod w Scala:Scala i Play! & Slick & PostgreSQL auto przyrost
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
}
}
listingu wszystkie produkty działa świetnie, jednak nie mogę zrobić dodając metody pracy.
Po wywołaniu:
val myProduct = models.Product(id = None, name = "test2", price = BigDecimal(2.99), description = "test3")
models.Products.add(myProduct)
constanty otrzymuję komunikat o błędzie informujący, że PostgreSQL id nie może być null. Całkowicie się z tym zgadzam, ale dlaczego kolumna id nie jest ustawiana przez autoInc? Czy to nie działa w ten sposób?
Używam gry! 2.1.2, Scala 2.10.0, PostgreSQL 9.3 i play-slick 0.3.3.
Z góry dziękuję.
Jaki jest twój schemat? Czy został stworzony przez gładkiego lub ręcznie? Prawdopodobnie kolumna id musi być typu serial lub bigserial, która naprawdę sprawia, że jest typu int lub bigint, ale także ustawia domyślną wartość nextval ("product_id_seq") i automatycznie tworzy tę sekwencję. – Tim
Jest tworzony automatycznie przez 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); '. Myślę, że jest już SERIAL, ale kod nie działa :( – oskario