Подтвердить что ты не робот

Обновление db-строки scala slick

У меня есть следующий код, который вставляет строку в таблицу с именем luczekInfo и функцию для получения данных из базы данных. Мой вопрос заключается в том, как сделать функцию для обновления столбцов из таблицы luczekInfo, в строках, возвращаемых функцией get (id). Каков наилучший способ обновления значений столбцов в 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))
  }
}

Заранее благодарим за ответы.

4b9b3361

Ответ 1

Slick 2.X

Вы можете обновить строку двумя способами (насколько мне известно), первым будет создание объекта строки типа 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

существует дополнительная поддержка операции insertOrUpdate (upsert):

luczekInfo.insertOrUpdate(row)