11

次のクエリのうち、テーブルの行数を取得するのに最も効率的なものを見つけたいので、selectステートメントを出力しようとしています。Queryableに追加できることは知っていますが、結果を生成するコードを削除して、たとえばに置き換える.selectStatement必要があるため、これが完全な真実を教えてくれるかどうかはわかりません。Slickはおそらく、長さを探していることを認識し、さらに最適化するので、クエリ全体のselectステートメントを確認します。これには、、または.list.length.selectStatement.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

play-2.2.1とslick2.0.0の場合、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 - \----------------------+---------------+-------+----------------------/

ロギングにはログバック構成のみを使用しているため、オンにするのは非常に簡単です。

<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を使用して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はほぼすべてをログに記録するようになります。ただし、設定->ワークシートで「出力する最大数または行数」を増やす必要があることに注意してください。

また、Slickを適切なログレベルに設定することも同じ目的に役立つことがわかります。

部屋の中の象について私に警告してくれたvirtualeyesに感謝します:-)

于 2013-02-13T07:50:58.413 に答える