Как получить автоматически увеличенный идентификатор с помощью slick/plainSQL?
-
21-12-2019 - |
Вопрос
Нет ли собственного решения slick/plainSQL для получения автоматически увеличивающегося идентификатора текущего INSERT?
userId — это автоматически увеличивающееся поле в моей таблице MySQL.
sql"""
INSERT INTO `table`(`email`)
OUTPUT INSERTED.userId
VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption
Помощь будет принята с благодарностью.
Ура, Оливер
Решение 2
Спасибо cvogt для помощи в этом обсуждении.
Я думаю, что было бы полезно представить PR, поскольку он является очень распространенной и полезной функциональностью, которая не должна отсутствовать в
Наконец, я нашел работу, чтобы заменить пропущенную родную функцию следующим образом.
В рамках одного и того же сеанса я устанавливаю два запроса. Первый - это оператор 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