4

Slick DSLでは、テーブルにオプションのフィールドを作成する2つの方法があります。

この場合のクラスの場合:

case class User(id: Option[Long] = None, fname: String, lname: String)

次のいずれかの方法でテーブルマッピングを作成できます。

object Users extends Table[User]("USERS") {
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
    def fname = column[String]("FNAME")
    def lname = column[String]("LNAME")
    def * = id.? ~ fname ~ lname <> (User, User.unapply _)
  }

  object Users extends Table[User]("USERS") {
    def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
    def fname = column[String]("FNAME")
    def lname = column[String]("LNAME")
    def * = id ~ fname ~ lname <> (User, User.unapply _)
  }
}

2つの違いは何ですか?一方は古い方法で、もう一方は新しい方法ですか、それとも異なる目的を果たしますか?

一貫性が高いため、ID定義の一部としてIDをオプションとして定義する2番目の選択肢をお勧めします。

4

1 に答える 1

5

最初の.?演算子では、投影を定義する瞬間にフィールドをオプションにする選択を延期することができます。時々それはあなたが望むものではありません、しかしあなたのPKをであると定義することOptionはおそらく少しおかしいです。なぜならPKがであると期待するかもしれないからですNOT NULL

たとえば、次の.?ほかに追加のプロジェクションで使用できます。*

def partial = id.? ~ fname

そうすればUsers.partial.insert(None, "Jacobus")、興味のない分野について心配する必要はありません。

于 2012-11-13T12:37:40.850 に答える