Как вы печатаете операторы select для следующих запросов Slick?

Я хотел бы выяснить, какой из следующих запросов будет наиболее эффективным для получения количества строк в таблице, поэтому я пытаюсь распечатать операторы выбора. Я знаю, что вы можете добавить.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

person Jack    schedule 12.02.2013    source источник
comment
Если вы используете *nix tail -f /path/to/query.log, должно помочь, не так ли?   -  person virtualeyes    schedule 13.02.2013
comment
Спасибо, я использую H2 на листе, но поиграю с ним.   -  person Jack    schedule 13.02.2013
comment
@virtualeyes, кажется, это лучшее (и единственное) решение. Для рабочих листов и H2 вам необходимо изменить уровень трассировки в URL-адресе базы данных, например. неявный val session = Database.forURL(jdbc:h2:mem:test1;TRACE_LEVEL_FILE=4, driver = org.h2.Driver).createSession(). Пожалуйста, дайте свое предложение (укажите рабочие листы) в качестве ответа.   -  person Jack    schedule 13.02.2013
comment
ваш ответ лучше подходит для H2, может пригодиться другим, ответьте сами ;-)   -  person virtualeyes    schedule 13.02.2013
comment
Спасибо @virtualeyes, готово   -  person Jack    schedule 13.02.2013


Ответы (6)


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

logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG
person user1187983    schedule 05.02.2014

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

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

person Mon Calamari    schedule 30.06.2015

В 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 - \----------------------+---------------+-------+----------------------/

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

<logger name="slick" level="INFO" />
<logger name="slick.jdbc" level="DEBUG" />
person leonidv    schedule 05.01.2016

В 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

person jazmit    schedule 11.06.2015
comment
похоже, это работает только для FixedSqlAction? Не работает с общим DBIO, например. присоединиться - person User; 21.12.2015

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

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

person moatra    schedule 22.08.2013

Я не смог распечатать операторы select с помощью 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, что предупредили меня о слоне в комнате :-)

person Jack    schedule 13.02.2013