2013-02-12 10 views
8

Ich versuche, eine Abfrage mit Slick 1.0.0 zu erstellen, die eine Zeile der folgenden SQL-Anweisung äquivalent zählen zurückgibt:Count Reihen mit Slick 1.0.0

SELECT COUNT(*) FROM table; 

Was ich habe, so weit ist:

Diese Drucke [email protected]. Außerdem scheint query.length vom Typ scala.slick.lifted.Column zu sein. Ich kann keine Möglichkeit finden, die Abfrage auszuführen. Alle Beispiele, die ich in der Dokumentation und anderswo finden kann, funktionieren nicht unter Column oder sind für ScalaQuery und funktionieren nicht mehr.

Was kann ich tun, um dies auszuführen?

Antwort

2

Verwendung:

val query = for(row <- Table) yield row 
println(Query(query.count).first) 

Die count entspricht "SELECT COUNT (*) FROM Table". Um die erste und einzige Zeile zu erhalten, müssen Sie first verwenden, um die Anzahl zu erhalten.

+2

Nur eine kurze Anmerkung: 'count' wird zugunsten von' length' veraltet. – notan3xit

+0

ok, funktioniert es für dich? – thikonom

+2

Haben Sie eine Vorstellung davon, was mit Werten vom Typ 'scala.slick.lifed.Column' geschieht, die von Methoden wie' length' zurückgegeben werden? Ihre Lösung funktioniert zwar, erzeugt aber eine ziemlich lange Aussage mit drei 'SELECT's. Das scheint eine Menge zu sein für eine einfache Zählung ohne weitere Anforderungen: 'wähle x2.x3 aus (wähle count (1) als x3 von (wähle x4.'id ', x4.'value' aus 'table' x4) x5) x2' – notan3xit

4

Jedes dieser Programme sollte es tun:

Query(MyTable).list.length 

oder

(for{mt <- MyTable} yield mt).list.length 

oder

(for{mt <- MyTable} yield mt.count).first 

Update:

Pri nting die Datenbanklog H2 zeigt dies für die letzte Abfrage, die optimal aussieht:

03:31:26.560 [main] DEBUG h2database - jdbc[2] 
/**/PreparedStatement prep10 = conn1.prepareStatement("select select count(1) from \"MYTABLE\" s5", 1003, 1007); 
+5

Nun, dies würde vor dem Zählen eine Liste mit dem vollständigen Ergebnissatz erstellen. Es funktioniert natürlich, aber für sehr große Tabellen ist es unpraktisch, da die Länge in O (n) -Komplexität von sowohl Zeit als auch Raum berechnet wird. – notan3xit

+0

Ich habe eine weitere hinzugefügt, aber das kann dieselbe select-Anweisung wie die in thikonoms Antwort erzeugen. Obwohl es etwas anders ist – Jack

+0

Für Ihre dritte Version bekomme ich eine 'MySQLSyntaxErrorException'. – notan3xit

4

Obwohl ich nicht in der Lage war zu überprüfen, SQL, Sie kürzere Quelle durch Fallenlassen .list bekommen konnte:

Query(MyTable.length).first 
+0

Das sieht für mich wie die sauberste Lösung aus, aber es scheint immer noch SQL zu erzeugen, das alle Felder in 'MyTable' zählt und nicht so effizient wie' SELECT COUNT (*) FROM "MyTable"; ' – dbau

+0

Problemseite: https : //github.com/slick/slick/issues/175 Hinterlasse einen Kommentar dort. – Tvaroh