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.? ~ 最初 ~ 最後 <> (User, User.unapply _) ID を返す

Users.autoInc.insert代わりに使用してください。

print(Users.autoInc.insert(User(None, "Jack", "Green" )))

以下も参照してください。

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 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 に答える
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 に答える