2

私の進化の 1 つには、BIGSERIAL列を持つ非常に単純なテーブル定義が含まれています。

CREATE TABLE product (
  id    BIGSERIAL NOT NULL PRIMARY KEY,
  name  VARCHAR   NOT NULL,
  color VARCHAR   NOT NULL
);

SlickCodeGeneratorデータベース自体からクラスを生成するために使用します。

case class ProductRow(id: Long, name: String, color: String)

implicit def GetResultProductRow(implicit e0: GR[Long], e1: GR[String]): GR[ProductRow] = GR{
    prs => import prs._
    ProductRow.tupled((<<[Long], <<[String], <<[String]))
}

class Product(_tableTag: Tag) extends Table[ProductRow](_tableTag, "product") {
  def * = (id, name, color) <> (ProductRow.tupled, ProductRow.unapply)
  def ? = (Rep.Some(id), Rep.Some(name), Rep.Some(color)).shaped.<>({r=>import r._; _1.map(_=> ProductRow.tupled((_1.get, _2.get, _3.get)))}, (_:Any) =>  throw new Exception("Inserting into ? projection not supported."))

  val id: Rep[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
  val name: Rep[String] = column[String]("name")
  val color: Rep[String] = column[String]("color")
}

lazy val Product = new TableQuery(tag => new Product(tag))

Productデータベースによって生成されるように、IDなしでテーブルに行を挿入したいと思います。問題はProductRow.idオプションではないことです。ほとんどの解決策は、クラスに新しいメソッドを追加することを提案していますが、変更がいつでも失われる可能性があるため、Productによって生成されたソースには触れないでください。slickそのような生成されたファイルを使用して ID なしで行を挿入する方法はありますか?

私は、を使用Slick 3.0Playframework 2.4.1ます。

編集:ダミーIDを送信すると問題は解決しますが、ネットワーク上では冗長です。私は次のようなものを探しています: insert into product(name, color) values('name', 'color').

4

1 に答える 1

3

bigserial の場合、productRow の id として任意の値を送信できます...自動生成された値に置き換える必要があります...また、id を送信したくない場合でも、送信する製品と同じフィールドを持つ id なしで 1 つのケース クラスを作成します。 :

case class ProductSimilar(name: String, color: String)
val prodSimilar =ProductSimilar("name","color")

挿入する前に、id フィールド以外のフィールドをコピーすると、データベースに挿入できます。

 val db: PostgresDriver.backend.DatabaseDef = Database.forURL(url, user=user, password=password, driver= jdbcDriver)
    val row = Product(0L ,prodSimilar.name,prodSimilar.color)
    db.run(query returning query.map(obj => obj) += row)

これが役立つことを願っています...

于 2015-07-03T11:29:48.863 に答える