web-dev-qa-db-ja.com

db行の更新scala slick

LuczekInfoという名前のテーブルに行を挿入する次のコードと、データベースからデータを取得する関数があります。私の質問は、get(id)関数によって返される行で、テーブルluczekInfoから列を更新する関数を作成する方法です。 Slickで列の値を更新する最良の方法は何ですか?

def create(profil: luczekInfo): Either[Failure, luczekInfo] = {
  try {
    val id = db.withSession {
      LuczekInfo returning LuczekInfo.id insert profil
    }
    Right(profil.copy(id = Some(id)))
  } catch {
    case e: SQLException =>
      Left(databaseError(e))
  }
}

def get(id: Int): Either[Failure, luczekInfo] = {
  try {
    db.withSession {
      LuczekInfo.findById(id).firstOption match {
        case Some(profil: luczekInfo) =>
          Right(profil)
            case _ =>
              Left(notFoundError(id))
      }
    }
  } catch {
    case e: SQLException =>
      Left(databaseError(e))
  }
}

回答ありがとうございます。

15
pmalecki

Slick 2.X

(私が知る限り)2つの方法で行を更新できます。最初の方法は、タイプluczekInfo#TableElementTypeの行オブジェクトを作成し、それを使用して行全体を更新することです。

def updateById(id: Long, row: luczekInfo#TableElementType)(implicit s: Session): Boolean =
  luczekInfo.filter(_.id === id).update(row)

または、次を使用して単一のフィールドを更新できます。

def updateNameById(mId: Long, mName: String)(implicit s: Session) = {
  val q = for { l <- luczekInfo if l.id === mId } yield l.name
  q.update(mName).run
}

あなたのテーブルにnameというファイルがあると思いました。

更新に関するセクションの Slickドキュメント にもあります。

Slick 3.1.X

insertOrUpdatepsert )操作の追加サポートがあります:

luczekInfo.insertOrUpdate(row)
22
Ende Neu