2017-01-10 5 views
0

SlickクエリでSELECT文とDELETE文を組み合わせることができないのはなぜですか?以下のように:Slickトランザクションで選択と削除を混在させる方法

val query = (for { 
    item <- SomeTable 
    _ <- OtherTable.filter(_.id === item.id).delete 
} yield()).transactionally 

" 'トランザクション' 記号を解決できません"

(それは場合に役立ちます.transactionallyせず、それは、Query[Nothing, Nothing, Seq]ある) 2つのアクションが別途作業中:

val query = (for { 
    item <- SomeTable 
} yield()).transactionally 

,

val query = (for { 
    _ <- OtherTable.filter(_.id === 2).delete 
} yield()).transactionally 
+0

てみ '項目< - SomeTable.result'。 2番目のコンパイル例が得られません。 'SomeTable'は' TableQuery'の権利ですか? –

+0

私は試しました。それで、私は 'item'を使って2番目のテーブルを削除したり、削除したりすることはできません(私は最初のスニペットを更新してこれを表示しました)。実際のクエリはより複雑です。 – JulienD

+0

@ insan-e 'SomeTable'は' TableQuery'です。後に 'filter'を追加することもできます。 'for'を使ってselect文を連鎖させることもできますし、delete文を使うこともできますが、両方を明らかにすることはできません。 – JulienD

答えて

2

OKこれは、DBIOQueryを混合する古典的な例です。

あなたの最初のケースで:あなたはアクションのみ使用することができますDMLのため明らかに

val query = (for { 
    item <- SomeTable // this is `Query` 
    _ <- OtherTable.filter(_.id === item.id).delete // this is `DBIO` 
} yield()).transactionally 

QueryDQLのためである - 単にSELECTです)。

まずは、まずDBIOを使用するようにコードを変更します。以下の例は正しくありません。

val query = (for { 
    item <- SomeTable.result // this is `DBIO` now 
    _ <- OtherTable.filter(_.id === item.id).delete // but this won't work !! 
} yield()).transactionally 

OKですが、問題はほぼあります。問題はコンパイルされないことです。何をする必要がある今、この部分があることに注意してくださいすることです:

item <- SomeTable.result 

戻ります(他のものの間であなたのidが含まれている)あなたのSomeTableケースクラスのSeq

それでは、考慮に入れてみましょう:

val query = (for { 
    items <- SomeTable.result // I changed the name to `items` to reflect it's plural nature 
    _ <- OtherTable.filter(_.id.inset(items.map(_.id))).delete // I needed to change it to generate `IN` query 
} yield()).transactionally 
+0

私は物事を分割しなければなりませんでした。 1つのクエリで選択してそのクエリとトランザクション内の削除を入れますが、最終的には 'result'を追加したときに機能しました。詳細な説明をありがとうIDEでオブジェクト型を検査するのは容易ではありません。結合の構文 – JulienD

関連する問題