2013-02-12 63 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" />