Как вы печатаете утверждения select для следующих запросов 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

Ответ 1

Я не смог распечатать инструкции выбора с помощью Slick, но Virtualeyes сделал хорошее предложение: посмотрите журналы базы данных!

Ну, я тестирую свой код Slick в Scala Worksheets, и вот как вы его настраиваете - для рабочих листов и H2 вам нужно изменить уровень трассировки в URL-адресе базы данных, например.

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

Это скажет H2, чтобы записывать почти все. Имейте в виду, что вам нужно увеличить "максимальное число или строки для вывода" в настройках → Рабочий лист.

Также выясняется, что установка Slick на правильном уровне ведения журнала будет служить той же цели.

Спасибо virtualeyes за то, что предупредил меня о слоне в комнате: -)

Ответ 2

В play-2.2.1 с slick 2.0.0 в application.conf есть:

logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG

Ответ 3

В Playframework 2.4.x с Slick 3.0+ используйте следующую запись:

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

Ответ 4

В Slick 3.1.0 (и я полагаю, что в версии 3.0) вы можете сделать очень классный отладчик sql:

[DEBUG] - slick.jdbc.JdbcBackend.statement - Preparing statement: select "id", "email", "name", "password" from "users" where ("email" = '[email protected]') 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... | [email protected] | petya | $2a$10$WyOrBy7p48... |
[DEBUG] - slick.jdbc.StatementInvoker.result - \----------------------+---------------+-------+----------------------/

Я использую только конфигурацию журнала для ведения журнала, поэтому очень легко включить:

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

Ответ 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

Ответ 6

Если у вас установлена ​​структура ведения журнала, вы можете установить scala.slick.session=DEBUG для регистрации событий и запросов пула подключений.

(Примечание: настройка scala.slick=DEBUG утопит вас информацией из компилятора запроса)