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)
如果你觉得它更容易,你可以for用flatMaps和a 替换理解map.
Slick还有两个方便的助手,即DBIO.seq(按顺序运行查询并丢弃结果,返回Unit)和DBIO.sequence(同样但保留所有单个操作的结果).
| 归档时间: |
|
| 查看次数: |
2814 次 |
| 最近记录: |