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

Posted

技术标签:

【中文标题】插入具有自动增量 id 的行 - Playframework Scala - Slick【英文标题】:Insert row with auto increment id - Playframework Scala - Slick 【发布时间】:2015-07-03 10:15:54 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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)

希望这有帮助...

【讨论】:

嗨,谢谢。它按预期工作,但我不喜欢通过网络向数据库服务器发送不必要的 id 的想法。 insert into product(name, color) values ("name", "color") 应该够了.. @MonCalamari 您知道可以将原始 SQL 与 Slick 一起使用吗? slick.typesafe.com/doc/3.0.0/sql.html

以上是关于插入具有自动增量 id 的行 - Playframework Scala - Slick的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:在具有自动增量ID的字段上插入随机ID

在 Oracle 中插入具有自动增量 ID 的新行

访问mysql中最后插入的行

MySQL 多行插入是不是获取顺序自动增量 ID?

如何获取由一个多行插入语句创建的行的所有 id

C#获取mysql自动增量值[重复]