插入具有自动增量ID的行 - Playframework Scala - Slick

时间:2015-07-03 10:15:54

标签: scala playframework slick playframework-evolutions

我的一个演变包含一个非常简单的表定义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))

我想在没有id的情况下向Product表插入一行,因此它将由数据库生成。问题是ProductRow.id不是可选的。大多数解决方案建议在Product类中添加新方法,但是我不得触及slick生成的源,因为更改可能会随时丢失。有没有办法使用这样生成的文件插入没有ID的行?

我使用Slick 3.0Playframework 2.4.1

编辑:发送虚拟ID可解决问题,但它在线路上是多余的。我正在寻找类似的东西:insert into product(name, color) values('name', 'color')

1 个答案:

答案 0 :(得分:3)

你可以在productRow中发送任何值作为id,如果它的bigserial ...它应该被自动生成的值替换...即使你不想发送id然后创建一个没有id具有相同字段的case类产品发送:

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)

希望这有用......