Как я могу узнать, где все эти дополнительные выборки sqlite3 генерируются в моем приложении rails? - PullRequest
5 голосов
/ 29 апреля 2010

Я пытаюсь выяснить, где целая куча дополнительных запросов генерируется моим приложением rails. Мне нужно несколько идей о том, как справиться с этим. Или, если кто-то может дать мне несколько советов, я буду благодарен.

Я получаю это:

  SQL (1.0ms)    SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'

  SQL (0.8ms)    SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'

  SQL (0.8ms)    SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'

повторяется снова и снова при каждом запросе к БД (до 70 раз за один запрос)

Я попытался установить плагин, который отслеживал источник запросов, но это действительно не помогло. Я использую гем hobofields, не знаю, если это именно то, что он делает, но я немного привязан к нему на данный момент

Какие-нибудь советы по поиску источника этих дополнительных запросов?

Ответы [ 4 ]

3 голосов
/ 21 июля 2011

Посмотрите на камень ActiveRecord в файле connection_adapters / sqlite_adapter.rb в строке 173 (я использую ActiveRecord 3.0.7), у вас есть функция с именем таблицы, которая генерирует точный отправленный вами запрос:

SELECT name FROM sqlite_master WHERE type = 'table' AND NOT name = 'sqlite_sequence'

В режиме разработки эта функция вызывается для каждой таблицы из вашей базы данных при каждом запросе. В производственном процессе эта функция вызывается только один раз, когда сервер запускается, а результат кэшируется.


При разработке каждого запроса рельсы заглядывают в вашу базу данных, чтобы увидеть, какие столбцы есть в каждой таблице, чтобы она могла генерировать методы в ваших моделях, такие как "find_by_name". Поскольку в производственной среде маловероятно, что ваша база данных изменится, rails выполняет этот поиск только при запуске сервера.

0 голосов
/ 23 мая 2011

Я только что видел, что это появляется в моих журналах, когда я выполняю поиск с использованием метаисследования, но ТОЛЬКО в режиме разработки.

0 голосов
/ 05 июня 2011

Я считаю, что это вызвано плагином acts-as-taggable-on.

Он проверит, существует ли таблица или столбец кэша.

0 голосов
/ 29 апреля 2010

Очень трудно сказать это, не заглядывая в Кодекс.

но я уверен, что вы пишете свой запрос в определенном цикле

for i in 0..70
  SqliteMaster.find(:all, :conditions=>["type=? and not name=?", 'table', 'sqlite_sequesnce'])
end

Поэтому я советую проверить все методы, которые вызываются после запроса определенного метода, и посмотреть, вызван ли запрос в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...