更新db row scala slick

pma*_*cki 15 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))
  }
}
Run Code Online (Sandbox Code Playgroud)

提前感谢您的回答.

End*_*Neu 22

光滑2.X

您可以通过两种方式更新行(据我所知),第一种方法是创建类型的行对象luczekInfo#TableElementType并使用它来更新整行:

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

或者您可以使用以下方法更新单个字

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
}
Run Code Online (Sandbox Code Playgroud)

我认为你的表有一个名为的文件name.

您也可以在Slick文档的更新部分找到它.

光滑3.1.X

insertOrUpdate(upsert)操作有额外的支持:

luczekInfo.insertOrUpdate(row)
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以编写直接的SQL查询,它也可以在Slick中:) (3认同)
  • @szefuf你的意思是"看起来效率低下"?这不是一个集合的过滤器,这将被翻译成类似于`WHERE l.id ='someId'的东西,我不知道你为什么认为这很慢,除非你把它看作是一个操作集合而不是构建查询的方法. (3认同)