私は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, ......)
私の同僚を記述する必要があります。提案してください!
データベースレベルで定義できます。 http://slick.lightbend.com/doc/3.0.0/queries.html#insertingでドキュメントを確認してください。 「挿入操作にAutoInc列を含めると、データベースが適切な値を生成できるように、静的に無視されます。意味はダミーの値を渡すことができ、dbはIDを自動的にインクリメントします – pedrorijo91
私はそれを文書に気付きました。しかし、これはコードがあまり単純ではないと感じています。 – SexyNerd