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

Jac*_*ack 10 scala slick

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

Query(MyTable).list.length

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

(for{mt <- MyTable} yield mt.count).first
Run Code Online (Sandbox Code Playgroud)

use*_*983 16

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

logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG
Run Code Online (Sandbox Code Playgroud)


Mon*_*ari 8

Playframework 2.4.xSlick 3.0+使用下面的条目:

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


leo*_*idv 6

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

[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 - \----------------------+---------------+-------+----------------------/
Run Code Online (Sandbox Code Playgroud)

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

<logger name="slick" level="INFO" />
<logger name="slick.jdbc" level="DEBUG" />
Run Code Online (Sandbox Code Playgroud)


jaz*_*mit 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这似乎只适用于`FixedSqlAction`?不适用于通用的`DBIO`,例如连接 (4认同)

Jac*_*ack 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()
Run Code Online (Sandbox Code Playgroud)

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

事实证明,将 Slick 设置为正确的日志记录级别也能达到相同的目的。

感谢 virtualeyes 提醒我注意房间里的大象:-)