3

从内存数据库更改为 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))
  }
}
4

1 回答 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.

于 2013-11-12T12:35:16.017 回答