【问题标题】:Returning the auto incrementing value after an insert using slick使用 slick 插入后返回自动递增值
【发布时间】:2014-05-29 02:10:25
【问题描述】:

我正在使用 slick 2.0.1(如果需要可以升级),我想从数据库(postgresql)中检索自动递增值。

我已经看到了一些关于 SO 的问题,但它们已经相当老了,我希望有比这个答案建议的更好的方法:Scala & Play! & Slick & PostgreSQL auto increment

def autoInc = name ~ price ~ description returning id

def add(product: Product)(implicit s:Session): Long = {
    Products.autoInc.insert(p.name, p.price, p.description)
}

您必须在 autoInc 方法中重新输入模型的字段,这是重复我希望避免的事情。

有没有更好的方法或者我应该这样做?

我选择的方式是让我的模型 poso(普通的旧 scala 对象,例如):

case class Product(.....)

然后我的 dao 类看起来像:

class ProductDao extends ProductDao {
  class Products(tag: Tag) extends Table[Product](tag, "products") {

     def id = ...
     def name = ..

     def * = (id, name) <> (Product.tupled, Product.unapply)

  }

  val products = TableQuery()
}

另外作为旁注,对于 * 方法,我必须输入所有类似的属性还是有更好的方法?

【问题讨论】:

    标签: scala playframework slick slick-2.0


    【解决方案1】:

    您看到的autoIncforInsert 投影模式适用于Slick 1,但不适用于Slick 2,其中自动递增的值在插入时会被自动忽略。见http://slick.typesafe.com/doc/2.0.2/migration.html#inserting

    你能比重复你的列名更好吗?或者您的数据模型工件的多种表现形式?代码生成是一种方法:http://slick.typesafe.com/doc/2.0.2/code-generation.html我将在 Scala 日讨论这个问题。

    要返回 id,请使用 returning,就像在 Slick 1 中一样。http://slick.typesafe.com/doc/2.0.2/queries.html#inserting

    【讨论】:

    • 我明白了,但是当我插入时如何取回自动递增的值?
    • 我理解那部分,我想知道插入新行时从数据库返回主键/自动递增值的巧妙 2 方式。
    • returning 就像在 Slick 1 中一样。slick.typesafe.com/doc/2.0.2/queries.html#inserting
    • 谢谢。以前我用这个非常清晰和明确的语句插入我的模型:users.insert(user) 现在我这样插入,所以我可以取回 PK autoinc id,你能解释一下这个语句,以便我们知道发生了什么 b/c 看起来很对我来说很神奇:val newId = (users returning users.map(_.id) += user insert 语句在哪里,我知道返回是获取 db id 值,但我没有看到 insert 调用。谢谢!
    • 我不明白你的意思。 += 只是 insert 的别名。同样的行为。
    猜你喜欢
    • 2015-10-05
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多