Слик: получение идентификатора вставленного значения

#scala #slick

Вопрос:

Следуя этой части документации https://scala-slick.org/doc/3.0.0/queries.html#inserting, Я пытаюсь реализовать операцию вставки, как показано выше:

 var point = TableQuery[Geopointtable]
val writeQuery = point returning point.map(_.id)
val geoId = writeQuery  = GeopointtableRow(0, 50, 40)

val idFromDb = db.run(geoId)
 

Я ожидал, что последняя строка кода вернет идентификатор новой строки в таблице. Вместо этого он возвращает: «Future()». Кстати, в базе данных строка создается успешно.

Есть ли какая-то ошибка, или я не совсем понимаю эту часть документации. Может быть, есть другой способ получить идентификатор?

Ответ №1:

Это объясняется в разделе «Начало работы» .:

API Slick полностью асинхронен и выполняет вызов базы данных в отдельном пуле потоков.

Это означает, что db.run возвращает Future значение, которое завершается, когда операция завершена (или завершается неудачно, если операция завершается неудачно). Поэтому вам нужно обработать результат внутри Future :

 db.run(geoId).map{ idFromDb =>
  // Process the id here
}
 

Обработка произойдет, когда операция с базой данных завершится. Основной поток не будет блокироваться.