Getting autoincrement values with Slick library in Scala

前端 未结 4 546
醉酒成梦
醉酒成梦 2021-02-01 21:22

How do I get the auto-incremented values for records inserted with Slick? The following code prints 1111. I would have expected it to print 1234

import scala.sli         


        
相关标签:
4条回答
  • 2021-02-01 21:50

    You can retrieve the generated value like this.

    Add autoInc method to Users object.

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

    Use Users.autoInc.insert instead.

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

    See also:

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

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

    0 讨论(0)
  • 2021-02-01 21:50

    For me, following source worked (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)
    }
    
    0 讨论(0)
  • 2021-02-01 22:11

    The latest version of Slick (2.1.0) automatically takes care of ignoring the auto-incremented ids and the documentation demonstrates how to retrieve the id:

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

    This is the full monty, where the retrieved value is then inserted back into the object you are adding to the table. If you just want to get your hands on the id itself:

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

    Both code snippets were taken from the official docs. It seemed like this question needed updating for newcomers (like me) who have never used earlier versions of Slick.

    0 讨论(0)
  • 2021-02-01 22:12

    According to SLICK Inserting document, you should define a method forInsert looks like:

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

    To get result:

    def save(user: User): User = {
        val id = users.forInsert.insert(user)
        new User(Some(id), user.first, user.last)
    }
    
    0 讨论(0)
提交回复
热议问题