2013-02-12 2 views
10

Vorrei sapere quale delle seguenti query sarebbe la più efficiente per ottenere un conteggio di righe su un tavolo, quindi sto provando a stampare le istruzioni di selezione. So che è possibile aggiungere .selectStatement a Queryable ma non so se questo mi dice la verità completa perché dovrò rimuovere il codice di generazione dei risultati, ad es. .list.length e sostituirlo con .selectStatement. Slick probabilmente raccoglie che si sta cercando per la lunghezza e ottimizza ulteriormente, quindi voglio vedere la dichiarazione prescelta per l'intera query, tra cui il codice SQL che verrà generato a causa della .list.length, o .count).firstCome si stampano le istruzioni select per le seguenti query Slick?

Query(MyTable).list.length 

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

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

Se si è su * nix "tail -f /path/to/query.log" dovrebbe fare il trucco, no? – virtualeyes

+0

Grazie, sto usando H2 nel foglio di lavoro, ma giocherò con esso. – Jack

+1

@virtualeyes, che sembra essere la migliore (e unica) soluzione. Per i fogli di lavoro e H2 è necessario modificare il livello di traccia nell'URL del database, ad es. implicit val session = Database.forURL ("jdbc: h2: mem: test1; TRACE_LEVEL_FILE = 4", driver = "org.h2.Driver"). createSession(). Si prega di dare il vostro suggerimento (gentilmente menzionare fogli di lavoro) come risposta. – Jack

risposta

3

I Non sono stato in grado di stampare le dichiarazioni di selezione usando Slick, ma Virtualeyes ha fatto un buon suggerimento: guarda i registri del database!

Bene, eseguo il test del codice Slick nei fogli di lavoro Scala, e questo è il modo in cui si procede alla configurazione. Per i fogli di lavoro e H2 è necessario modificare il livello di traccia nell'URL del database, ad es.

implicit val session = Database.forURL(
"jdbc:h2:mem:test1;TRACE_LEVEL_FILE=4", 
driver = "org.h2.Driver") 
.createSession() 

Questo indicherà a H2 di registrare quasi tutto. Tuttavia, tieni presente che dovrai aumentare il "numero massimo o le righe da stampare" nelle preferenze -> Foglio di lavoro.

Si scopre inoltre che l'impostazione Slick al livello corretto di registrazione avrà lo stesso scopo.

Grazie virtualeyes per avermi avvertito l'elefante nella stanza :-)

4

Se si dispone di impostare un quadro di registrazione, è possibile impostare scala.slick.session=DEBUG per registrare gli eventi del pool di connessione e le query.

(Nota: L'impostazione scala.slick=DEBUG annegherà con le informazioni dal compilatore query)

16

In play-2.2.1 con chiazza di petrolio 2.0.0, in application.conf avere:

logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG 
5

In Slick 3,0 ora è possibile ottenere direttamente il codice SQL per l'esecuzione direttamente

val q = coffees.filter(_.supID === 15) 
val action = q.delete 
val affectedRowsCount: Future[Int] = db.run(action) 
val sql = action.statements.head 

Vedere http://slick.typesafe.com/doc/3.0.0/queries.html#querying

+4

che sembra funzionare solo per 'FixedSqlAction', però? Non funziona con un generico 'DBIO', ad es. unirsi – Ixx

7

In Playframework 2.4.x con Slick 3.0+ uso seguente voce:

<logger name="slick.jdbc" level="DEBUG"/>

6

In Slick 3.1.0 (e suppongo che in 3.0) si può fare molto cool sql debug:

[DEBUG] - slick.jdbc.JdbcBackend.statement - Preparing statement: select "id", "email", "name", "password" from "users" where ("email" = '[email protected]') and ("password" = ext.crypt('123456',"password")) 
[DEBUG] - slick.jdbc.JdbcBackend.benchmark - Execution of prepared statement took 56ms 
[DEBUG] - slick.jdbc.StatementInvoker.result - /----------------------+---------------+-------+----------------------\ 
[DEBUG] - slick.jdbc.StatementInvoker.result - | 1     | 2    | 3  | 4     | 
[DEBUG] - slick.jdbc.StatementInvoker.result - | id     | email   | name | password    | 
[DEBUG] - slick.jdbc.StatementInvoker.result - |----------------------+---------------+-------+----------------------| 
[DEBUG] - slick.jdbc.StatementInvoker.result - | 4fe6e5c3-af74-40f... | [email protected] | petya | $2a$10$WyOrBy7p48... | 
[DEBUG] - slick.jdbc.StatementInvoker.result - \----------------------+---------------+-------+----------------------/ 

Io uso solo logback configurazione per la registrazione, quindi è molto facile accendere:

<logger name="slick" level="INFO" /> 
<logger name="slick.jdbc" level="DEBUG" />