2013-02-12 45 views
10

我想知道下列哪個查詢對於獲取表上的行數最有效,所以我試圖打印出select語句。我知道你可以將.selectStatement添加到Queryable中,但不知道這是否告訴我完整的事實,因爲我必須刪除結果生成代碼,例如.list.length並將其替換爲.selectStatement。油滑可能拿起你正在尋找的長度,並進一步優化了,所以我希望看到的select語句的整個查詢,包括將因爲.list.length的生成SQL或.count).first如何打印以下Slick查詢的select語句?

Query(MyTable).list.length 

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

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

如果你在* nix「tail -f /path/to/query.log」應該做的伎倆,不? – virtualeyes 2013-02-12 20:34:18

+0

謝謝,我在工作表中使用H2,但會與它一起玩。 – Jack 2013-02-13 01:44:03

+1

@virtualeyes,這似乎是最好的(也是唯一的)解決方案。對於工作表和H2,您需要更改數據庫網址中的跟蹤級別,例如implicit val session = Database.forURL(「jdbc:h2:mem:test1; TRACE_LEVEL_FILE = 4」,driver =「org.h2.Driver」)。createSession()。請給出您的建議(請提及工作表)作爲答案。 – Jack 2013-02-13 01:51:05

回答

3

我沒有能夠使用Slick打印選擇語句,但Virtualeyes提出了一個很好的建議:查看數據庫日誌!

那麼,我測試了Scala工作表中的Slick代碼,這就是你如何設置它 - 對於工作表和H2,你需要改變數據庫url中的跟蹤級別。

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

這將告訴H2記錄一切。請記住,您必須在首選項 - >工作表中增加'輸出的最大數量或行數'。

事實證明,在正確的日誌記錄級別設置Slick也可以達到同樣的目的。爲提醒我的大象在房間裏:-)

4

如果你有一個日誌框架建立

感謝virtualeyes,您可以設置scala.slick.session=DEBUG登錄連接池的事件和查詢。

(注意:設置scala.slick=DEBUG將你淹沒與查詢編譯信息)

16

在播放2.2.1用油滑2.0.0,在application.conf有:

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

在油滑3.0你現在可以直接得到執行SQL直接

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

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

+4

這似乎只適用於'FixedSqlAction'雖然?不適用於通用的'DBIO',例如加入 – Ixx 2015-12-20 21:10:25

7

Playframework 2.4.xSlick 3.0+使用以下條目:

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

6

在油滑3.1.0(我想在3.0),你可以做出非常酷的SQL調試:

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

我只使用的logback配置日誌,所以它很容易打開:

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