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[....
请问我的表类或存储所有类的对象是否需要继承特定内容?
问题原因及解决办法
你的表类不需要额外继承任何内容,问题出在插入代码的写法上:
returning方法的调用对象错误:returning不是TableQuery的方法,而是要在排除自增主键的插入投影上调用。因为orderId是自增字段,插入时不需要传入值,你应该先定义一个只包含需要插入字段的投影,再对这个投影调用returning。插入数据的格式错误:不需要传入
0作为orderId的占位值,直接传入其他三个字段即可。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
相关产品推荐
相关产品推荐

