2016-05-20 2 views
0

私はPostgresのベースのプロジェクトのためにスリック3.1.1を使用する必要があるが、私は次スーパー簡単な使用のためのクリーンなコードを書くのに苦労があります単純なSlick INSERT/GETのベストプラクティスは何ですか?

case class Task(id: Option[UUID], foo: Int, bar: String) 

は私がTaskモデルを持っていると仮定

id: UUIDがプライマリキーなので、データベースのINSERTを実行するときには(id = None)入力しないでください。しかし、データベース行をTaskオブジェクトにマップするGETを実行するときには、これが必要です。

したがって、スリックTableクラスは、非常に醜い次のようになります。

class Tasks(tag: Tag) extends Table[Task](tag, "tasks") { 

    def id = column[UUID]("id", O.SqlType("UUID"), O.PrimaryKey) 

    def foo = column[Int]("foo") 

    def bar = column[String]("bar") 

    def insert: MappedProjection[Task, (Int, String)] = 
    (foo, bar).shaped.<>(
     { tuple => 
     Task.tupled(None, tuple._1, tuple._2) 
     }, { (task: Task) => 
     Task.unapply(task).map { tuple => 
      (tuple._2, tuple._3) 
     } 
     } 
    ) 

    override def * : ProvenShape[Task] = 
    (id.?, 
     foo, 
     bar).shaped.<>(Task.tupled, Task.unapply) 
} 

ケースクラスタスクは10個の要素を持っている場合、私はその後、私は上記のようなPRを提出する場合は、私の顔を平手打ちします(tuple._1, tuple._2, tuple._3, ......)私の同僚を記述する必要があります。提案してください!

+0

データベースレベルで定義できます。 http://slick.lightbend.com/doc/3.0.0/queries.html#insertingでドキュメントを確認してください。 「挿入操作にAutoInc列を含めると、データベースが適切な値を生成できるように、静的に無視されます。意味はダミーの値を渡すことができ、dbはIDを自動的にインクリメントします – pedrorijo91

+0

私はそれを文書に気付きました。しかし、これはコードがあまり単純ではないと感じています。 – SexyNerd

答えて

0

データベースがあなたのIDを自動インクリメントしてもらおう場合は、その表の定義を大幅に短縮することができます

import slick.driver.PostgresDriver.api._ 
import java.util.UUID 

case class Task(id: Option[UUID], foo: Int, bar: String) 

class Tasks(tag: Tag) extends Table[Task](tag, "tasks") { 
    def id = column[Option[UUID]]("id", O.SqlType("UUID"), O.PrimaryKey, O.AutoInc) 
    def foo = column[Int]("foo") 
    def bar = column[String]("bar") 

    def * = (id, foo, bar) <> (Task.tupled, Task.unapply) 
} 

これはケースクラスの最後にidフィールドを移動して与えることによって、さらに向上させることができデフォルト値はNoneです。このようにして、Taskをインスタンス化するたびに提供する必要はありません。

case class Task(foo: Int, bar: String, id: Option[UUID] = None) 

val firstTask = Task(123, "John") 
val secondTask = Task(456, "Paul") 
+0

次のようなコンパイルエラーが発生しました: '' [エラー] found:((Int、String))=> models.Task [エラー]必須:((Int、String、Option [UUID]))=>? [エラー]).shaped。<>(Task.tupled、Task.unapply) [エラー]^ '' ' – SexyNerd

+0

' def * 'メソッドで' id'を使用していないようです。ここにあなたのコードを投稿できますか? –

関連する問題