我想找出以下哪个查询对于获取表上的行计数最有效,所以我正在尝试打印出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
答案 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警告我房间里的大象: - )