Как получить автоматически увеличенный идентификатор с помощью slick/plainSQL?

StackOverflow https://stackoverflow.com//questions/22013105

Вопрос

Нет ли собственного решения slick/plainSQL для получения автоматически увеличивающегося идентификатора текущего INSERT?

userId — это автоматически увеличивающееся поле в моей таблице MySQL.

sql"""
   INSERT INTO `table`(`email`) 
   OUTPUT INSERTED.userId 
   VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption

Помощь будет принята с благодарностью.

Ура, Оливер

Это было полезно?

Решение 2

Спасибо cvogt для помощи в этом обсуждении. Я думаю, что было бы полезно представить PR, поскольку он является очень распространенной и полезной функциональностью, которая не должна отсутствовать в запросы Slick's Plainsql .

Наконец, я нашел работу, чтобы заменить пропущенную родную функцию следующим образом.

В рамках одного и того же сеанса я устанавливаю два запроса. Первый - это оператор INSERT, второе утверждение является SELECT LAST_INSERT_ID(), который возвращает новейшее автоматическое сгенерированное значение, которое было установлено для столбца AUTO_INCREMENT, недавно выполненным генеракодицетагкодом (1). Подробнее здесь: MySQL Ссылка - Last_insert_id ()

Database.forDataSource(dataSource).withDynSession {
  sqlu"""INSERT INTO `users`(`email`) VALUES ("theEmailAdress@test.de")
  """.firstOption match {
    case Some(num) if num == 1 => sql"SELECT LAST_INSERT_ID()".as[Long].firstOption()
    case None => None
  }
}
.

Это работает для меня прямо сейчас. Если есть какие-либо улучшения, не стесняйтесь публиковать свое решение.

Другие советы

Зависит от базы данных.

Для MS SQL это SCOPE_IDENTITY(), для MySQL — LAST_INSERT_ID().Попробуйте найти эквивалент для вашей БД, если это не что-то из вышеперечисленного.

Добавил(а) cvogt:

В настоящее время для этого не существует встроенной функции slick для простого SQL и нет способа получить доступ к базовому оператору jdbc при использовании Slick. sql"..." интерполяция или StaticQuery, что позволит вам получить доступ getGeneratedKeys.Вероятно, вы могли бы исправить SQL-интерполятор и ЗаявлениеИнвокер чтобы позволить это.Их всего 150 LOC.Возможно, стоит попробовать и подать пиар.

Однако вы можете использовать один из блестящая сессия метод типа withPreparedInsertStatement, который обертывает JDBC-соединение методы для работы с оператором jdbc.Я создал PR, чтобы добавить документацию по этому поводу: https://github.com/slick/slick/pull/691

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top