2013-07-13 20 views
5

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.

+0

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

+0

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

risposta

5

Ecco un suggerimento, riscrivere il autoInc e aggiungere metodi come questo:

def autoInc = name ~ price ~ description returning id 

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

Alcuni database own't permettono di inserire nulla nella colonna di incremento automatico. Forse è il caso Postgres.

+1

Questo è corretto :) (e l'esempio di database di computer game-slick sbagliato). – cvogt

+0

Perfetto! Grazie. – oskario

+0

L'esempio non dovrebbe essere 'add (p: Product) ...' o '..autoInc.insert (product.name) ...'? – jbnunn

Problemi correlati