Ho il seguente codice a Scala:Scala & Gioca! & Slick e PostgreSQL incremento automatico
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
}
}
Elenco di tutti i prodotti di grandi opere, però, non posso fare metodo di lavoro aggiungendo.
Dopo aver chiamato:
val myProduct = models.Product(id = None, name = "test2", price = BigDecimal(2.99), description = "test3")
models.Products.add(myProduct)
ho constanty un messaggio di errore da PostgreSQL dicendo che id non può essere nulla. Sono assolutamente d'accordo, ma perché la colonna id non viene impostata da autoInc? Non funziona in questo modo?
Io uso Play! 2.1.2, Scala 2.10.0, PostgreSQL 9.3 e play-slick 0.3.3.
Grazie in anticipo.
Qual è il tuo schema? È stato creato da slick o a mano? Probabilmente, la colonna id deve essere di tipo serial o bigserial, che in realtà lo rende di tipo int o bigint, ma imposta anche il valore predefinito su nextval ('product_id_seq') e crea automaticamente tale sequenza. – Tim
Viene creato automaticamente da Slick: 'create table" product "(" id "SERIAL NON NULL PRIMARY KEY," name "VARCHAR (254) NOT NULL," price "DECIMAL (21,2) NOT NULL," description "VARCHAR (254) NOT NULL); '. Penso che sia già SERIAL, ma il codice non funziona :( – oskario