2016-08-03 5 views
0

В приведенном ниже примере показано, как обновить один столбец PRICE, первый выбор строки, а затем обновить его:Обновление более одного столбца в Slick 3.x

val q = for { c <- coffees if c.name === "Espresso" } yield c.price 
val updateAction = q.update(10.49) 

// Get the statement without having to specify an updated value: 
val sql = q.updateStatement 

// compiles to SQL: 
// update "COFFEES" set "PRICE" = ? where "COFFEES"."COF_NAME" = 'Espresso' 

Но что если мне нужно обновить три столбца? возможно ли с этим подходом?

UPDATE

Эти классы баз данных

class OlapDB(tag: Tag) extends Table[Olap](tag, "olap_queries") { 

    def sk = column[Int]("sk", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("name") 
    def descrip = column[Option[String]]("descrip") 
    def notes = column[Option[String]]("notes") 
    def mdx = column[String]("mdx") 
    def folderSk = column[Int]("folder_sk") 
    def lastUpdateUser = column[Option[String]]("last_upd_user") 
    def lastUpdateTS = column[Option[LocalDateTime]]("last_upd_ts")(localDateTimeColumnType) 
    def version = column[Int]("version") 

    def * = (sk, name, descrip, notes, mdx, folderSk, lastUpdateUser, lastUpdateTS, version) 
    <> ((Olap.apply _).tupled, Olap.unapply) 
} 

case class Olap (sk: Int, 
        name: String, 
        descrip: Option[String], 
        notes: Option[String], 
        mdx: String, 
        folderSk: Int, 
        lastUpdateUser: Option[String], 
        lastUpdateTS: Option[LocalDateTime], 
        version: Int) 

ответ

1

Это может быть достигнуто путем выбора всех столбцов, которые должны быть обновлены:

  • С для понимания, используя yield:

    val query = for { c <- coffees if c.name === "Espresso" } yield (c.price, c.name) 
    val updateAction = query.update((10.49, "Cappuccino")) 
    
  • Без для понимания, используя map:

    val updateAction = coffees.filter(_.name === "Espresso").map(c => (c.price, c.name)).update((10.49, "Cappuccino")) 
    

Те два действия будут переведены на следующий запрос SQL:

update "COFFEES" set "PRICE" = ?, "COF_NAME" = ? where "COFFEES"."COF_NAME" = 'Espresso' 
+0

Я получаю следующие ошибки, когда я попробуйте использовать опцию 'map':' ◾Не найдено соответствия Shape. Слик не знает, как сопоставить данные типы. Возможные причины: T в таблице [T] не соответствует вашей проекции *. Или вы используете неподдерживаемый тип в запросе (например, scala List). Требуемый уровень: slick.lifted.FlatShapeLevel Тип источника: (slick.lifted.Rep [String], slick.lifted.Rep [Option [String]], slick.lifted.Rep [Option [java.time.LocalDateTime]]) Распакованный тип: T Упакованный тип: G' – ps0604

+0

вторая ошибка: '◾ недостаточно аргументов для карты метода: (неявная форма: slick.lifted.Shape [_ <: slick.lifted.FlatShapeLevel, (slick.lifted.Rep [String], slick.lifted.Rep [Option [String]], slick.lifted.Rep [Option [java.time.LocalDateTime]]), T, G]) slick.lifted.Query [G, T, Seq]. Необработанная форма параметра значения. * Проекция прекрасна, поскольку класс базы данных компилируется без ошибок. – ps0604

+0

. Вы не указали определение своей таблицы в вопросе, поэтому я предположил, что вы используете его из документов Slick. Поскольку у вас есть другое определение таблицы, вы должны отредактировать свой вопрос и указать его. –

 Смежные вопросы

  • Нет связанных вопросов^_^