2013-07-13 7 views
5

私は、Scalaでは、次のコードを持っている:すべての製品をリストスカラ&プレイ! &スリック&PostgreSQLの自動インクリメント

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 
    } 
} 

は素晴らしい作品は、しかし、私は、メソッドの動作を追加することはできません。呼び出した後

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

私はそのidはnullにすることはできませんと言ってはPostgreSQLのエラーメッセージが表示されますconstanty。私はそれに完全に同意しますが、なぜidカラムがautoIncによって設定されていないのですか?そんなにうまくいきませんか?

私はPlay!を使用します。 2.1.2、Scala 2.10.0、PostgreSQL 9.3、およびplay-slick 0.3.3をサポートしています。

ありがとうございます。

def autoInc = name ~ price ~ description returning id 

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

あなたが自動増分列にnullを挿入することができown'tいくつかのデータベース:ここ

+0

あなたのスキーマは何ですか?それは滑らかか手で作られましたか?おそらく、idカラムは、タイプserialまたはbigserialである必要があります。実際にはint型またはbigint型になりますが、デフォルト値はnextval( 'product_id_seq')に設定され、自動的にそのシーケンスが作成されます。 – Tim

+0

これはSlickによって自動的に作成されます: 'create table" product "(" id "SERIAL NOT NULL PRIMARY KEY、name" VARCHAR(254)NOT NULL "、" DECIMAL(21,2)NOT NULL "、description" VARCHAR (254)NOT NULL); '。私はそれが既にSERIALだと思うが、コードはうまくいかない:( – oskario

答えて

5

はあなたautoIncを書き換え、このようなメソッドを追加し、提案です。たぶんそれはPostgresのケースです。

+1

それは正しい:)(そして、遊び心のあるコンピュータデータベースの例が間違っている)。 – cvogt

+0

パーフェクト!ありがとう。 – oskario

+0

例は 'add(p:Product)...'や '..autoInc.insert(product.name)...'ではないでしょうか? – jbnunn