gpt4 book ai didi

scala - autoInc 与 Postgres 和 Slick

转载 作者:行者123 更新时间:2023-12-01 10:51:12 25 4
gpt4 key购买 nike

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

最佳答案

对于 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

关于scala - autoInc 与 Postgres 和 Slick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19928503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com