如何打印以下Slick查询的select语句?

时间:2013-02-12 19:12:48

标签: scala slick

我想找出以下哪个查询对于获取表上的行计数最有效,所以我正在尝试打印出select语句。我知道您可以将.selectStatement添加到Queryable,但不知道这是否告诉我完整的事实,因为我必须删除结果生成代码,例如.list.length并将其替换为.selectStatement。 Slick可能会发现你正在寻找长度并进一步优化,所以我希望看到整个查询的select语句,包括因.list.length而生成的SQL,或.count).first

Query(MyTable).list.length

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

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

6 个答案:

答案 0 :(得分:16)

在play-2.2.1中使用slick 2.0.0,在application.conf中有:

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

答案 1 :(得分:8)

Playframework 2.4.x Slick 3.0+使用以下条目:

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

答案 2 :(得分:6)

在Slick 3.1.0中(我想在3.0中)你可以进行非常酷的sql debug:

[DEBUG] - slick.jdbc.JdbcBackend.statement - Preparing statement: select "id", "email", "name", "password" from "users" where ("email" = 'petya@mail.ru') 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... | petya@mail.ru | petya | $2a$10$WyOrBy7p48... |
[DEBUG] - slick.jdbc.StatementInvoker.result - \----------------------+---------------+-------+----------------------/

我只使用logback配置进行日志记录,因此很容易打开:

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

答案 3 :(得分:5)

在Slick 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 :(得分:4)

如果您设置了日志记录框架,则可以设置scala.slick.session=DEBUG来记录连接池事件和查询。

(注意:设置scala.slick=DEBUG会淹没您查询编译器的信息)

答案 5 :(得分:3)

我无法使用Slick打印select语句,但Virtualeyes提出了一个很好的建议:查看数据库日志!

好吧,我在Scala工作表中测试了我的Slick代码,这就是你如何设置它 - 对于工作表和H2你需要更改数据库url中的跟踪级别,例如

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

这将告诉H2记录几乎所有内容。但请记住,您必须在首选项中增加“最大数量或输出行数” - &gt;工作表。

事实证明,将Slick设置在正确的日志记录级别将起到同样的作用。

感谢virtualeyes警告我房间里的大象: - )