2015-09-04 8 views
5

Utilizzo Slick da un po 'di tempo e ora sto migrando da Slick 2.1 a 3.0. Purtroppo sono rimasto bloccato con roba normale come contare le linee. Il mio codice ha funzionato perfettamente in Slick 2.1 quando ho usato per fare questo:Come COUNT (*) in Slick 3.0?

connection.withSession { 
    implicit session => coffees.length.run 
} 

Sul codice di cui sopra che avrei avuto il mio risultato come un Int, ma non riesco a farlo funzionare ora, dopo mi sono trasferito a Slick 3.0 .2 though the documentation tells me that the code should be the same.

Ho provato il seguente (già rimosso il withSession chiamata obsoleta):

connection.createSession.withTransaction { 
    coffees.length 
} 

Ma questo codice restituirà uno slick.lifted.Rep [Int] che non ha alcun metodo per ottenere il valore intero . Mi manca qualche importazione implicita?

risposta

3

Come probabilmente avete capito, il risultato della chiamata run è quello di produrre un Future, che risolverà in un momento successivo.

Mentre questo significa che alla fine da qualche parte nel codice il futuro dovrà essere atteso in un modo come si mostra nella risposta, questo può e deve essere respinto il più tardi possibile. Se stai lavorando con, ad esempio, il framework Play, usa Azioni asincrone e lascia che Play lo gestisca per te.

Nel lavoro frattempo con la Future come si farebbe con qualsiasi altro costrutto monadica (come Option) - chiamando map, flatMap, onSuccess e così via per la catena tuoi calcoli all'interno del propagato Future contesto.

+0

Buon punto. La mia applicazione originale non era originariamente pensata per essere in un contesto di gioco, ma dal momento che sarà integrata in un servizio web di Play nel prossimo futuro, dovrebbe fare il lavoro. Grazie per la tua risposta. –

1

Per favore, qualcuno mi dice che c'è un modo migliore per rispondere alla mia domanda. Ho preso a lavorare a fare questo, ma questo sembra terribile:

import scala.concurrent.duration._ 
import scala.concurrent.Await 
val timeout = Duration(10, SECONDS) 
val count = Await.result(connection.run(coffees.length.result), timeout) 
+0

Sarebbe piuttosto banale scrivere un metodo generico che esegue la query e attende il risultato, in modo che non ci sia bisogno di quella "bruttezza" ovunque. – JimN

+0

Sicuro. Mi chiedo solo perché Slick 3 non abbia alcuni impliciti a fare il lavoro come nella versione 2. –