3

私は2つOptionのsを持っています:

val name: Option[String] = ...
val shared: Option[Boolean] = ...

上記の値が の場合はこれらのフィールドを作成し、 の場合はそのままにしておくUPDATEクエリを作成したいと思います。SETSomeNone

私はこのようにこれを達成することができましたが、余分な列を追加する必要がある場合、コンマのチェックにはあまり熱心ではありません。また、を使用する必要があることにもあまり熱心ではありませんvar

 var query = Q.u + "UPDATE wishlist SET"
 if(name.isDefined)  query = query + " name = " +? name + (if (share.isDefined) ", " else "")
 if(shared.isDefined) query = query + " shared = " +? share

SQL インジェクションに関心がなければ、次のようなことができます。

 val fields = List(
   name.map(n => s"name = '$n'"),
   shared.map(e => s"shared = $e")
 ).flatten

 s"UPDATE wishlist SET ${fields.mkString(", ")}"

質問: Slick の単純な SQL/String 補間でこれを行うより良い方法はありますか?

4

1 に答える 1

1

それほどエレガントではありませんが、基本的なロジックを変更せずに多くの入力をサポートするように拡張できるという点で、少なくとも柔軟性があると思います。

 val name:Option[String] = Some("foo")
 val share:Option[String] = Some("bar")

 val sets = List(
   name.map(n => (" name = ", n)),
   share.map(s => (" shared = ", s))
 ).flatten

 val query2 = sets.zipWithIndex.foldLeft(Q.u + "UPDATE wishlist SET"){
   case (q,(p,0)) => q + p._1 +? p._2
   case (q,(p,i)) => q + "," + p._1 +? p._2
 }

フィールド名と値のペアを s のオプションとしてリストに入れ、Tupleフラット化してNones を削除しています。次に、最初の部分を超えるクエリの部分にはコンマが必要であることを考慮して、最後のステートメントを生成するために折りたたみます。

于 2013-08-09T17:52:58.243 に答える