2013-02-12 25 views
8

Ben bir sorgu oluşturmak çalışıyorum Bir satır aşağıdaki SQL deyimi eşdeğer saymak döndürür Slick 1.0.0:Sayım satırları Slick 1.0.0

SELECT COUNT(*) FROM table; 

Ne var bugüne kadar geçerli:

val query = for { 
    row <- Table 
} yield row 
println(query.length) 

Bu baskı [email protected]. Ayrıca, query.length, scala.slick.lifted.Column türünde görünüyor. Sorguyu yürütmenin bir yolunu bulamıyorum. Belgelerdeki ve başka herhangi bir yerde bulabildiğim tüm örnekler, Column üzerinde çalışmıyor veya ScalaQuery içindir ve artık çalışmıyor.

Bunu yürütmek için ne yapabilirim?

cevap

2

Kullanım:

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

count "Tablo SELECT COUNT (*)" eşdeğerdir. İlk ve tek sırayı almak için sayımı almak için first'u kullanmalısınız.

+2

Sadece hızlı bir not: 'say',' length' lehine kabul edilmez. – notan3xit

+0

tamam, sizin için çalışıyor mu? – thikonom

+2

'length' gibi yöntemlerle döndürülen' scala.slick.lifted.Column' türündeki değerlerle ilgili ne hakkında bir fikriniz var mı? Çözümünüz işe yarıyor, ancak üç 'SELECT' ile oldukça uzun bir deyim oluşturur. Bu, herhangi bir ek gereksinim olmaksızın basit bir sayım için çok fazla bir şey gibi görünüyor: 'x2.x3 öğesini seçin (x3 olarak sayım seçimini (1) x3 olarak seçin (x4.'id 'öğesini seçin, x4.'value' 'tablo' x4'den x5) x2' – notan3xit

4

Bunlardan herhangi hile yapmak gerekir:

Query(MyTable).list.length 

veya

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

veya

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

Güncelleme:

Pri Ben Oluşan sql kontrol etmek mümkün değildi rağmen sen .list bırakarak kısa kaynağını alabilir,

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

Eh, bu sayımdan önce tüm sonuç kümesini içeren bir liste oluşturur. Tabii ki çalışır, ama çok geniş tablolar için pratik değildir, çünkü uzunluk hem zaman hem de uzaydaki O (n) karmaşıklığında hesaplanır. – notan3xit

+0

Bir tane daha ekledim, ancak bu, tikonominin cevabındakiyle aynı seçim ifadesini oluşturabilir. Biraz farklı olsa da, – Jack

+0

Üçüncü sürümünüz için bir 'MySQLSyntaxErrorException 'alıyorum. – notan3xit

4

:

Query(MyTable.length).first 
H2 veritabanı günlüğü nting optimum görünüyor son sorguda, bu gösteriyor
+0

Bu benim için en temiz çözüm gibi görünüyor, ancak yine de 'MyTable' içindeki tüm alanları sayan ve "MyTable" SELECT COUNT (*) FROM " – dbau

+0

Sorun sayfası: https" kadar verimli değil gibi SQL oluşturuyor gibi görünüyor : //github.com/slick/slick/issues/175 Orada bir yorum bırakın. – Tvaroh