Как установить значение из одного столбца в другой в той же строке, нажав scala - PullRequest
0 голосов
/ 09 апреля 2020

пример кода
В моем случае:

import slick.jdbc.MySQLProfile.api._
import scala.concurrent.Await
import scala.concurrent.duration.Duration

case class User(id: Option[Int], vid: Int, first: String, last: String)

  class Users(tag: Tag) extends Table[User](tag, "users") {
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
    def vid = column[Int]("vid")
    def first = column[String]("first")
    def last = column[String]("last")
    def * = (id.?, vid, first, last) <> (User.tupled, User.unapply)
  }
  val users = TableQuery[Users]

  def usersForInsert = users.map(u => (u.vid, u.first, u.last).shaped <>
    ({t => User(None, t._1, t._2, t._3)}, {(u: User) => Some((u.vid, u.first, u.last))}))

//#insert vid value
   val userWithId =
     (users returning users.map(_.id)
        into ((user,id) => user.copy(id=Some(id)))

     //Here, I wonder how to replace the value of vid by id
     ) += User(None, 4, "Stefan", "Zeiger")
//#insert

    val userWithIdRes = Await.result(db.run(users.schema.create >> userWithId), Duration.Inf)
    println(userWithIdRes)

Я пробовал несколько способов, но всегда получаю ошибки при компиляции и запуске.
Спасибо за чтение вопрос начального уровня scala -slick

1 Ответ

0 голосов
/ 10 апреля 2020

Как вы определили User.id как AutoInc, вы не можете иметь значение для действия вставки. Будет сгенерировано системой БД. Итак, что вы можете сделать, сначала вставить и получить идентификатор, а затем обновить столбец, который вы хотите. Это можно сделать примерно так:

val newUserId: Future[Int] =
    for {
      userId <- db.run(
        (users returning users.map(_.id)) += User(None, 0, "Stefan", "Zeiger")
      )
      _ <- db.run(users.filter(_.id === userId).map(_.vid).update(userId))
    } yield userId

Однако есть дополнительный вызов в БД. Это может привести к проблемам с производительностью в будущем, когда у вас могут быть быстрые записи. Если это просто для целей обучения, да, это выполнимо, но в реальных основах кода лучше проектировать по-другому. Например, vid всегда имеет то же значение, что и id, поэтому вы можете использовать vid на уровне приложения, но не обязательно в БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...