2013-02-12 5 views
10

Ich möchte herausfinden, welche der folgenden Abfragen am effizientesten wäre, um eine Zeilenanzahl für eine Tabelle zu erhalten, also versuche ich, die Select-Anweisungen auszudrucken. Ich weiß, dass Sie .selectStatement zu einem Queryable hinzufügen können, aber nicht wissen, ob dies mir die vollständige Wahrheit sagt, weil ich den Ergebnis erzeugenden Code entfernen muss, z. .list.length und ersetzen Sie es durch .selectStatement. Slick wahrscheinlich aufgreift, dass Sie für die Länge suchen und weiter optimiert, so möchte ich die select-Anweisung für die gesamte Abfrage, um zu sehen, einschließlich der SQL, die aufgrund der .list.length erzeugt wird, oder .count).firstWie drucken Sie die Select-Anweisungen für die folgenden Slick-Abfragen?

Query(MyTable).list.length 

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

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

Wenn Sie auf * nix sind "tail -f /path/to/query.log" sollte den Trick tun, nicht? – virtualeyes

+0

Danke, ich benutze H2 im Arbeitsblatt, werde aber damit spielen. – Jack

+1

@virtualeyes, das scheint die beste (und einzige) Lösung zu sein. Für die Arbeitsblätter und H2 müssen Sie die Trace-Ebene in der Datenbank-URL ändern, z. implizite val session = Database.forURL ("jdbc: h2: mem: test1; TRACE_LEVEL_FILE = 4", treiber = "org.h2.Driver"). createSession(). Bitte geben Sie Ihren Vorschlag (Arbeitsblätter) als Antwort an. – Jack

Antwort

3

I Ich konnte die Select-Anweisungen nicht mit Slick ausdrucken, aber Virtualeyes hat einen guten Vorschlag gemacht: Schau dir die Datenbankprotokolle an!

Nun, ich teste meine Slick-Code in Scala Worksheets, und so geht es über die Einrichtung - Für die Arbeitsblätter und H2 müssen Sie die Trace-Ebene in der Datenbank-URL ändern, z.

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

Dies wird H2 informieren, um alles zu protokollieren. Beachten Sie jedoch, dass Sie die maximale Anzahl oder Zeilen, die ausgegeben werden sollen, in den Einstellungen -> Arbeitsblatt erhöhen müssen.

Es stellt sich auch heraus, dass die Einstellung von Slick auf der richtigen Ebene der Protokollierung den gleichen Zweck erfüllt.

Dank virtualeyes für mich in dem Raum zu den Elefanten alarmieren :-)

4

Wenn Sie eine Logging-Framework aufgebaut haben, können Sie scala.slick.session=DEBUG eingestellt Verbindungspool Ereignisse und Anfragen zu protokollieren.

(Anmerkung: scala.slick=DEBUG Einstellung werden Sie mit aus der Abfrage-Compiler Informationen ertrinken)

16

Im Play-2.2.1 mit Slick 2.0.0 in application.conf haben:

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

In Slick 3.0 können Sie jetzt direkt auf die SQL für die Ausführung erhalten direkt

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

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

+4

das scheint nur für 'FixedSqlAction' zu funktionieren? Funktioniert nicht mit einem generischen 'DBIO', z. ein Beitritt – Ixx

7

In Playframework 2.4.x mit Slick 3.0+ Verwendung folgender Eintrag:

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

6

In Slick 3.1.0 (und ich in 3.0 annehmen) Sie können sehr cool SQL Debug machen:

[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 - \----------------------+---------------+-------+----------------------/ 

ich nur verwenden logback Konfiguration für die Protokollierung, so dass es sehr einfach ist einzuschalten: