11

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

Query(MyTable).list.length

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

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

6 回答 6

16

在带有 slick 2.0.0 的 play-2.2.1 中,在 application.conf 中有:

logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG
于 2014-02-05T18:13:05.983 回答
8

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

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

于 2015-06-30T10:38:34.877 回答
8

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

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

<logger name="slick" level="INFO" />
<logger name="slick.jdbc" level="DEBUG" />
于 2016-01-05T16:55:48.207 回答
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

于 2015-06-11T10:52:56.997 回答
4

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

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

于 2013-08-22T06:14:27.070 回答
3

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

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

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

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

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

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

于 2013-02-13T07:50:58.413 回答