从内存数据库更改为 Postgres 时,我遇到了 Slick 和 Postgres 的 autoInc 问题。拼凑几个来源,我最终得到了以下解决方案。这避免了在插入时向 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))
}
}