2015-09-04 7 views
5

Ich benutze Slick schon eine ganze Weile und migriere jetzt von Slick 2.1 auf 3.0. Leider bin ich mit normalen Dingen wie dem Zählen von Linien hängen geblieben. Mein Code funktionierte perfekt in Slick 2.1, wenn ich verwenden, dies zu tun:Wie COUNT (*) in Slick 3.0?

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

Auf dem obigen Code ich mein Ergebnis als Int bekommen würde, aber ich kann es jetzt nicht an der Arbeit, nachdem ich zu Slick bewegte 3.0 .2 though the documentation tells me that the code should be the same.

versuchte ich folgende (ich die withSession veraltete Anruf bereits entfernt):

connection.createSession.withTransaction { 
    coffees.length 
} 

Aber dieser Code ein slick.lifted.Rep [Int] zurück, die keine Methode hat den ganzzahligen Wert zu erhalten . Fehle ich etwas impliziter Import?

Antwort

3

Wie Sie wahrscheinlich bemerkt haben, das Ergebnis des run Anrufs ein Future zu produzieren, die zu einem späteren Zeitpunkt behoben werden.

Während dies bedeutet, dass irgendwann irgendwo im Code die Zukunft auf eine Art und Weise gewartet werden muss, wie Sie in Ihrer Antwort zeigen, kann und sollte so spät wie möglich zurückgeschoben werden. Wenn Sie beispielsweise mit dem Play-Framework arbeiten, verwenden Sie asynchrone Aktionen und lassen Sie Play für Sie arbeiten.

In der Zwischenzeit der Arbeit mit den Future wie jedes anderen monadischen Konstrukt (wie Option) - Aufruf map, flatMap, onSuccess und so weiter an der Kette Ihre Berechnungen innerhalb des propagierten Future Kontextes.

+0

Guter Punkt. Meine ursprüngliche Anwendung war ursprünglich nicht für einen Play-Kontext vorgesehen, aber da sie in naher Zukunft in einen Play-Webdienst integriert wird, sollte sie die Arbeit übernehmen. Danke für deine Antwort. –

1

Bitte, jemand sagt mir, es gibt einen besseren Weg, um meine Frage zu beantworten. Ich habe es dies funktioniert tun, aber das sieht schrecklich:

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

Es wäre ziemlich trivial, eine generische Methode zu schreiben, die Ihre Abfrage ausführt und auf das Ergebnis wartet, damit Sie diese "Hässlichkeit" nicht überall benötigen. – JimN

+0

Sicher. Ich frage mich nur, warum Slick 3 nicht die gleiche Funktion wie in Version 2 hat. –

Verwandte Themen