Информацию об этом см. На странице http://drupal.org/node/1067802 .
Учитывая все это, в каких ситуациях я мог бы использовать db_select () или я должен полагаться исключительно на db_query?
Информацию об этом см. На странице http://drupal.org/node/1067802 .
Учитывая все это, в каких ситуациях я мог бы использовать db_select () или я должен полагаться исключительно на db_query?
Ответы:
Есть 5 причин использовать SelectQuery
Вы создаете динамические запросы с различным количеством условий, объединений, полей и так далее. Смотрите field_read_fields () для примера.
Вы хотите использовать так называемые расширители . Примерами экстендеров являются PagerDefault (заменяет pager_query () ) и TableSort (заменяет tablesort_sql () ). Это позволяет добавить дополнительные функции в SelectQuery. См. Также Как создавать сортируемые таблицы с помощью пейджера с данными из пользовательской таблицы? , Пример: node_page_default () .
Вы хотите, чтобы другие модули могли изменять ваши запросы. Затем вы можете добавить так называемые теги, и SelectQuery автоматически вызовет соответствующий крюк alter для этого тега. Я сильно полагаюсь на это с моим модулем Privatemsg (мы уже делали это в D6 с помощью специального построителя запросов).
Если вы хотите / должны использовать систему node_access, чтобы показывать только узлы, которые пользователь может видеть. Просто добавьте тег 'node_access' в ваш запрос $. Это заменяет db_rewrite_sql ().
SelectQuery имеет несколько функций, которые помогают сделать ваш код одинаковым для всех поддерживаемых баз данных. Например, есть SelectQuery :: orderRandom () . И если у вас есть условие LIKE, -> условие ('field', $ value, 'LIKE') гарантирует, что это сравнение будет всегда без учета регистра. В D6 вы должны были использовать LOWER () для того, что было намного медленнее. Но AFAIK, не больше, чем эти два прямо сейчас.
Если ни одна из этих причин не подходит для конкретного случая, используйте db_query ().
Документация оdb_query()
говорит:
Используйте эту функцию для запросов SELECT, если это просто строка запроса. Если вызывающий или другие модули должны изменить запрос, используйте взамен db_select ().
Я всегда использую db_select, поскольку предпочитаю удобочитаемость, удобство обслуживания и совместимость с базами данных, а не небольшой выигрыш в производительности. Более того, я думаю, что цифры, приведенные в упомянутой проблеме, дают неправильное представление об общей производительности. Мы говорим о разнице в 300 микросекунд в запросе, который при возврате более одного столбца часто выполняется в диапазоне нескольких миллисекунд. И я не удивлюсь, если есть одноразовые накладные расходы (загрузка классов) и, таким образом, различия для полного запроса (страницы) намного меньше.