#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
}
Обработка произойдет, когда операция с базой данных завершится. Основной поток не будет блокироваться.