如何在一个单独的事务中运行多个普通的SQL查询?

Cab*_*ero 2 sql-server scala jdbc playframework slick

我有一个Play/Slick应用程序,我需要在单个事务中运行多个普通的sql查询,检索上一个查询的结果,如下所示:

val id: Future[Int] = db.run {
    sql"""
        DECLARE @T TABLE (id INTEGER)
        INSERT INTO Foo (name) OUTPUT INSERTED.id INTO @T VALUES ('bar')
        SELECT id FROM @T
    """.as[Int].head
}
Run Code Online (Sandbox Code Playgroud)

上面的问题是它总是返回1,这是顶级查询声明临时表的结果.如何获取最后一个查询的结果?有问题的数据库是MS SQL Server.播放2.5.4,Slick 3.1.1.

ins*_*n-e 10

Slick Actions 最重要的特性之一是它们是可组合的,类似于Scala Future.恕我直言,文档并没有像它那样对待它......这是一个例子:

val createAction = sqlu"""DECLARE @T TABLE (id INTEGER)"""
val insertAction = sqlu"""INSERT INTO Foo (name) OUTPUT INSERTED.id INTO @T VALUES ('bar')"""
val selectAction = sql"""SELECT id FROM @T""".as[Int].head

val composedAction = for {
  createRes <- createAction
  insertRes <- insertAction
  selectRes <- selectAction
} yield selectRes

val id = db.run(composedAction.transactionally) // Future[...]
Run Code Online (Sandbox Code Playgroud)

如果你觉得它更容易,你可以forflatMaps和a 替换理解map.

Slick还有两个方便的助手,即DBIO.seq(按顺序运行查询并丢弃结果,返回Unit)和DBIO.sequence(同样但保留所有单个操作的结果).