В предыдущих версиях Slick была функция вставки, определенная в TableQuery, которая вернула результат вставки. Я перейти на новый API и делать что-то вроде:Возврат затронутых строк (Int) в Slick 3.0
DBIO.seq(someTable += someValue)
, но это имеет тип
dbio.DBIOAction[Unit, NoStream, Write]
Как я могу получить обратно строки пострадавших?
редактировать
Проблема здесь, кажется, что типы не выстраиваются в очередь, как я бы ожидать от них. Вот что Scala видит в виде:
val q: PostgresDriver.DriverAction[PostgresDriver.InsertActionExtensionMethods[(String, String)]#SingleInsertResult, NoStream, Write] = Admins.tableQuery += ((username, grantor))
val seq: dbio.DBIOAction[Unit, NoStream, Write] = DBIO.seq(q)
db.run(seq)
Это не имеет для меня никакого смысла. Если q
имеет тип DriverAction[PostgresDriver.InsertActionExtensionMethods[(String, String)]#SingleInsertResult...
, где SingleInsertResult является псевдонимом типа Int
, то не должен мой DBIO.seq
вернуть DBIOAction[Int, NoStream, Write]
?
Я не следил подробности того, что Стефан сделал с .SEQ и т.д., но это может быть просто недостающая особенность, когда составляющие действия не составляют затронутые строки. Может быть, открыть билет в github slick/slick. – cvogt
IIRC, 'DBIO.seq' используется для группировки множества различных запросов (даже разных типов), но поскольку он не может вернуть одно значение для всех запросов, он всегда возвращает' Future [Unit] ', чтобы вы могли ' t восстановить результаты запроса, затронутые строки и т. д. См. [документы для DBIO.seq] (http://slick.typesafe.com/doc/3.0.0/api/index.html#slick.dbio.DBIO$), * Более простая версия последовательности, которая принимает несколько DBIOActions с любым возвращаемым типом как varargs и возвращает DBIOAction, который выполняет отдельные действия последовательно (с использованием andThen), return() в конце. * –