Как вы печатаете утверждения 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
утопит вас информацией из компилятора запроса)