17

如何获取使用 Slick 插入的记录的自动递增值?以下代码打印 1111。我本来希望它打印 1234

import scala.slick.driver.H2Driver.simple._

object TestMappedTable extends App{
    case class User(id: Option[Int], first: String, last: String)

    object Users extends Table[User]("users") {
        def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
        def first = column[String]("first")
        def last = column[String]("last")
        def * = id.? ~ first ~ last <> (User, User.unapply _)
    }

  implicit val session = Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver").createSession()
  session.withTransaction{
    Users.ddl.create

    print(Users.insert(User(None, "Jack", "Green" )))
    print(Users.insert(User(None, "Joe", "Blue" )))
    print(Users.insert(User(None, "John", "Purple" )))
    print(Users.insert(User(None, "Jim", "Yellow" )))
  }
}

我正在为 Scala 2.10.0-RC1 使用 Slick 0.11.2

4

4 回答 4

11

您可以像这样检索生成的值。

向对象添加autoInc方法。Users

def autoInc = id.? ~ first ~ last <> (User, User.unapply _) 返回 id

改为使用Users.autoInc.insert

打印(Users.autoInc.insert(用户(无,“杰克”,“绿色”)))

也可以看看:

https://github.com/slick/slick/issues/10

https://github.com/slick/slick/commit/09a65a8e88a0363412e218dc5c06023b69809649

于 2012-10-29T01:40:09.290 回答
9

最新版本的 Slick (2.1.0) 会自动忽略自动递增的 id,文档演示了如何检索 id:

val userWithId =
  (users returning users.map(_.id)
         into ((user,id) => user.copy(id=Some(id)))
  ) += User(None, "Stefan", "Zeiger")

这是完整的内容,然后将检索到的值插入回要添加到表中的对象中。如果您只想掌握 id 本身:

val userId =
  (users returning users.map(_.id)) += User(None, "Stefan", "Zeiger")

两个代码片段均取自官方文档。对于从未使用过早期版本的 Slick 的新手(比如我)来说,这个问题似乎需要更新。

于 2014-12-05T10:55:01.513 回答
0

根据SLICK Inserting document,您应该定义一个方法,forInsert如下所示:

def forInsert = first ~ last <> (
    { t =>
        User(None, t._1, t._2)},
    { (u: User) =>
        Some((u.first, u.last))
    }) returning id

要获得结果:

def save(user: User): User = {
    val id = users.forInsert.insert(user)
    new User(Some(id), user.first, user.last)
}
于 2013-12-11T04:53:56.023 回答
0

对我来说,以下来源有效(Slick 3.0.2)

class Track(tag: Tag)
   extends Table[(Int, String, String)](tag, "TRACK") {
   // This is the primary key column:
   def id: Rep[Int] = column[Int]("ID", O.PrimaryKey, O.AutoInc)
   def artist: Rep[String] = column[String]("ARTIST")
   def name: Rep[String] = column[String]("NAME")

   def * : ProvenShape[(Int, String, String)] =
     (id, artist, name)
}
于 2015-08-31T12:49:21.083 回答