2017-10-29 11 views
1

私がしようとしているのはトランザクションで3つのテーブルに挿入することですが、後者の挿入は最初のテーブルに基づいています。ここでSlick 3 - 他のテーブルに基づいて複数のテーブルにトランザクション的に挿入

は明確なクエリです:

val personId = persons returning persons.map(_.id)) += Person(occupation) 
translatedProperty += TranslatedProperty(languageId, propertyId, propertyName) 
personProperties += PersonProperty(personId, propertyId, propertyValue) 

は、今私はどこからSeq(propertyName, propertyValue)を取得し、その上で繰り返します。

上記のように順番に挿入すると、データベースがクラッシュするなどの理由で、すべて機能しなくなるまですべてが機能します。したがって、上記の挿入をトランザクション的に行いたいと思います。

は、私はそうしようとした:私は、その後 props = (properties.values.map { ...(代わりの <-私は =を使用)とが、無駄にしようとした

[error] found : Seq[Unit] [error] required: slick.dbio.DBIOAction[?,?,?] [error] props <- (properties.values.map

val dbAction = (for { 
    val personId = persons returning persons.map(_.id)) += Person(occupation) 
    props <- (properties.values.map { 
    x => 
    { 
     val name = x.key 
     val value = x.value 

     translatedProperties += TranslatedProperty(languageId, propertyId, name) 
     personProperties += PersonProperty(personId, propertyId, value) 
    } 
    }) 
} yield()).transactionally 

db.run(dbAction) 

これは私にコンパイルエラーが発生します。人は挿入されますが、プロパティは挿入されません。

私はここで間違っていますか?

propsはちょうど1つではなくSeq[FixedSqlAction]になると思われますか?

私はここでh2を使用していることを言及する必要があります。

答えて

3

I assume it's because props would be a Seq[FixedSqlAction] instead of just one?

はい、それはまさにその理由です。

あなたの問題を解決するには、単にそのようDBIO.seqproperties.values.map...部分をラップすることです:

val dbAction = (for { 
    val personId = persons returning persons.map(_.id)) += Person(occupation) 
    props <- DBIO.seq(properties.values.map { 
    x => 
    { 
     val name = x.key 
     val value = x.value 

    val insertTranslatedProperties = translatedProperties += TranslatedProperty(languageId, propertyId, name) 
    val insertPersonProperties = personProperties += PersonProperty(personId, propertyId, value) 

    insertTranslatedProperties andThen insertPersonProperties 
    } 
    }: _*) 
} yield()).transactionally 

はまた、1 DBIOAction

にそれらをマージする andThenと内側の2つのインサートをチェーン
関連する問題