You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Slick 3.4.1中TableQuery调用returning方法报错求助

Slick 3.4.1插入订单数据获取自增主键失败问题

我用Slick 3.4.1和Akka-Http开发API,处理订单POST请求时,把订单数据插入数据库并获取自增主键遇到了问题。

订单表定义如下:

class Orders(tag: Tag) extends Table[(Int,Int,String,String)](tag,"ORDERS"){
  val orderId = column[Int]("order_id",O.PrimaryKey, O.AutoInc)
  val screeningId = column[Int]("screening_id")
  val name = column[String]("name")
  val surname = column[String]("surname")

  def * = (orderId,screeningId,name,surname)

  def screening = foreignKey("screening_id",screeningId,screenings)(_.screeningId)

}
val orders = TableQuery[Orders]

根据Slick文档,我应该用returning方法获取自动生成的主键,于是写了下面的插入方法:

def insertOrderToBase(rep: OrderRep) = {
  val insert = (orders.returning(orders.map(_.orderId))) += (0,rep.screeningId,rep.name,rep.surname)
  Await.result(db.run(insert).result, 2.seconds)
}

但构建时出现错误:

value returning is not a member of slick.lifted.TableQuery[....

请问我的表类或存储所有类的对象是否需要继承特定内容?


问题原因及解决办法

你的表类不需要额外继承任何内容,问题出在插入代码的写法上:

  1. returning方法的调用对象错误:returning不是TableQuery的方法,而是要在排除自增主键的插入投影上调用。因为orderId是自增字段,插入时不需要传入值,你应该先定义一个只包含需要插入字段的投影,再对这个投影调用returning。

  2. 插入数据的格式错误:不需要传入0作为orderId的占位值,直接传入其他三个字段即可。

  3. Future调用冗余:db.run(insert)已经返回Future[Int](即生成的orderId),不需要再调用.result。

修正后的插入方法代码如下:

def insertOrderToBase(rep: OrderRep): Int = {
  // 定义插入投影:排除自增的orderId,只包含需要插入的字段
  val insertProjection = orders.map(o => (o.screeningId, o.name, o.surname))
  // 指定返回自增的orderId,然后执行插入
  val insertAction = insertProjection.returning(orders.map(_.orderId)) += (rep.screeningId, rep.name, rep.surname)
  // 等待Future完成并返回结果
  Await.result(db.run(insertAction), 2.seconds)
}

另外,建议尽量避免在Akka-Http中使用Await.result,会阻塞线程,更好的做法是返回Future[Int],让Akka-Http异步处理响应。


内容的提问来源于stack exchange,提问作者Ni3dzwi3dz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:01:08