2016-07-29 3 views
1

I持ってプレイ私はそうのような最後のクエリの結果を取得し、単一のトランザクションで複数のプレーンなSQLクエリを実行する必要がある/スリックアプリケーション:1つのトランザクションで複数のプレーンな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 
} 

上記の問題点は、常に1を返すということですテンポラリ・テーブルを宣言する最上位のクエリの結果です。代わりに最後のクエリの結果を取得するにはどうすればよいですか?問題のデータベースはMS SQL Serverです。プレイ2.5.4、スリック3.1.1。

+0

アクションを分けて分かりやすく分けますか?そして '.transactionally'を追加しますか? –

+0

@ insan-e私はそのようなことをしようとしていましたが、構文を理解できませんでした。その例はまったくありません。 – Caballero

+0

ええ、ドキュメントでは、クエリの構成についてほとんど2つのセンテンスがあります... –

答えて

3

Slick Actionの最も重要な機能の1つは、Scala Futureに似ています。 IMHO、ドキュメントが同じくらいそれが必要として、それを扱うことはありません...ここでは例です:

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[...] 

あなたはflatMap sのfor理解し、あなたはそれが簡単に見つけたら終わりmapを置き換えることができます。

は、2つの便利なスリックからヘルパー、すなわちDBIO.seqは(Unitを返し、結果シーケンス内のクエリと破棄を実行)とDBIO.sequence(同じですが、が保存さすべての個々の行動の結果)があります。

+0

ありがとう、私は同じようなことをしようとしていましたが、 'selectAction'がコンポジションに嫌いなので、あなたの例はエラーでコンパイルされません' Compilation error [値マップはslick.jdbc.SQLActionBuilderのメンバーではありません] ' – Caballero

+0

申し訳ありませんが、3番目のクエリの最後に' as [Int] .head'がありませんでしたが、エラーは異なります - 'SQLServerException:テーブルを宣言する必要があります変数 "@T" .'は明らかにクエリが並行して実行されることを意味するので、for構造体はここでは機能しません。 – Caballero

+0

私はそうではないと思います。そのための理解は、flatMapとmapのシンタックスシュガーです。おそらく、問題はSlickがテンポラリテーブルの作成をどのように処理してクエリを実行するかである...私は専門家ではありません。笑.. xD –

0

DBIO.seq()の使用はいかがですか。 DBIO.seqがUnitを返すので、selectActionはandThen()によって続けられます。

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 id = db.run(DBIO.seq(createAction, insertAction) andThen selectAction) 
関連する問題