2015-05-15 6 views
4

В предыдущих версиях 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]?

+0

Я не следил подробности того, что Стефан сделал с .SEQ и т.д., но это может быть просто недостающая особенность, когда составляющие действия не составляют затронутые строки. Может быть, открыть билет в github slick/slick. – cvogt

+0

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() в конце. * –

ответ

1

Посмотрите на these examples

Это не очень отличается от гладкого 2.x, но теперь все возвращается фьючерсами.

Может быть что-то вдоль линий (с верхней части моей головы, я не могу проверить это сам в настоящее время)

val users = TableQuer[Users] 
// this is the query 
val q = (users += User(None, "Stefan", "Zeiger")) 
// now you run it 
db.run(q).map{ affectedRows => 
    case 1 => println("success") 
    case _ => println("oops") 
} 
Смежные вопросы