使用Postgres和Slick实现自增字段

3

在从内存数据库切换到Postgres时,我遇到了Slick和Postgres的自增问题。通过拼凑多个来源,我最终得出了以下解决方案。这避免了在插入操作中向Id列提供Null,并返回插入记录的id,但代价是需要在表的3个不同位置重复字段。有没有什么方法可以改进这个问题?尤其是对于withoutId定义,以及要求列出字段的插入本身。

case class Product(
  id: Option[Long], 
  name: String,
  description: String
)

object Products extends Table[Product]("products") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def description = column[Int]("description")
  def * = id.? ~ name ~ description <> (Product, Product.unapply _) // Fields listed
  def withoutId = name ~ description returning id // Fields listed again minus id

  def insert(product: Product): Product = {
    val id = DB withSession {
      withoutId.insert(product.name, product.description) // Fields listed again
    }
    product.copy(id = Option(id))
  }
}
1个回答

6

对于Slick 1.x,你可以按照以前的方法来做。这样做可以节省一些模板代码:

def columns = name ~ description
def * = id.? ~: columns <> (Product, Product.unapply _) // Fields listed
def withoutId = name ~ description returning id // Fields listed again minus id

在Slick 2.x中,autoinc列会自动被忽略,因此 .insert 应该可以正常工作。如果您真的想插入到autoinc列中,可以使用 .forceInsert

谢谢,这正是我想要的。很高兴知道在未来我们还可以使用Slick 2.0进一步清理代码。 - matthewrk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接