2013-07-13 14 views
5

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ę.

+0

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

+0

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

Odpowiedz

5

Oto propozycja, przepisać autoInc i dodać metody tak:

def autoInc = name ~ price ~ description returning id 

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

niektórych baz danych own't pozwalają wstawić wartość null w kolumnie automatycznego przyrostu. Może to sprawa Postgres.

+1

To jest poprawne :) (i przykład złośliwego komputera-bazy danych jest zły). – cvogt

+0

Idealny! Dzięki. – oskario

+0

Czy nie powinien to być przykład 'add (p: Product) ...' lub '..autoInc.insert (product.name) ...'? – jbnunn

Powiązane problemy