在 Slick 2.0 中插入后返回 AutoInc ID

Posted

技术标签:

【中文标题】在 Slick 2.0 中插入后返回 AutoInc ID【英文标题】:Returning AutoInc ID after Insert in Slick 2.0 【发布时间】:2014-03-20 14:28:51 【问题描述】:

我一直在寻找这个问题的答案。 slick 2.0 上没有太多信息。下面是我的 Addresses 模型的代码,我如何让方法 create 在插入后返回 id?

package models
import play.api.Play.current
import play.api.db.slick.Config.driver.simple._
import play.api.db.slick.DB

    object Addresses
      val DB_URL:String = "jdbc:h2:mem:fls-play"
      val DB_driver:String = "org.h2.Driver"
      class Addresses(tag: Tag) extends Table[(String, String, String, String, String)](tag, "ADDRESSES")
       def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
       def city = column[String]("CITY")
       def stateName = column[String]("STATE_NAME")
       def street1 = column[String]("STREET1")
       def street2 = column[String]("STREET2")
       def zip = column[String]("ZIP")

       def * = (city, stateName, street1, street2, zip)
      
      val addresses = TableQuery[Addresses]

      def create(city:String, stateName:String, street1:String, street2:String, zip:String) 
        DB.withSession implicit session =>
           addresses += (city, stateName, street1, street2, zip)
        
      
    

谢谢!

【问题讨论】:

how do i return an sequence generation for the id using Scala Slick 的可能重复项 @barnesjd 我认为这个答案涉及 slick 1.0。 @MartinKolinek 啊,确实......很好。 【参考方案1】:

试试

(addresses returning addresses.map(_.id)) += (city, stateName, street1, street2, zip)

没测试过,但是显示here

【讨论】:

非常感谢,我不敢相信我错过了。 @Martin 那么你回答方法调用的主体是什么?你不能使用元组以某种方式减少代码吗?我不喜欢我们必须重复列。希望您能澄清这段代码的实际位置?这和 * = 方法在同一个地方吗? @Blankman 如果你已经有一个列的元组,你应该可以使用(add returning add.map(_.id)) += tuple 之类的东西。如果这就是你要问的。 顺便说一下,要映射使用returning 的结果(例如,只插入某些列),您必须在使用returning之前 使用映射。然后您可以像往常一样拨打insert。例如,addresses.map(row => (row.name, row.desc)).returning(addresses.map(_.id)).insert(("Name", "Desc")) 为什么 userId(在文档 sn-p 中)是 FixedSqlAction[Int, NoStream, Effect.Write] 类型的?如何从中获取 id?【参考方案2】:

如果你有默认值的字段,你可以试试这个

addresses.map(c => (c.city, c.stateName, c.street1)) returning addresses.map(_.id) += (city, stateName, street1)

【讨论】:

不错的一个!我一直在寻找这个。谢谢

以上是关于在 Slick 2.0 中插入后返回 AutoInc ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Slick 2.0 中计数(*)?

是否有使用 Postgres 的 Slick 2.0 AutoInc 的工作示例?

使用 Slick 3.0 在同一事务中进行多次插入

Scala slick 2.0 updateAll 等同于 insertALL?

Slick 3.0 批量插入或更新(更新插入)

Slick 3.1 - 从 DBIOAction 打印 SQL(插入语句)