我想找出以下哪个查询对于获取表上的行计数最有效,所以我正在尝试打印出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)
在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)
在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
我无法使用 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 提醒我注意房间里的大象:-)
| 归档时间: |
|
| 查看次数: |
10294 次 |
| 最近记录: |