我正在使用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()
}
另外作为旁注,对于*方法,我是否必须输入所有类似的属性,还是有更好的方法呢?
答案 0 :(得分:5)
您看到的autoInc
或forInsert
投影模式适用于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