뷰에서 실행 된 실제 쿼리 가져 오기


23

특정 쿼리에서 실행되는 SQL 쿼리를 찾아야합니다. 뷰 모듈은 뷰를 구성 할 때 SQL을 표시 할 수 있지만 쿼리는 모든 경우에 실행되는 실제 쿼리가 아닙니다 .
Devel 모듈은 데이터베이스 쿼리를 표시 할 수 있지만 모든 쿼리와 관련된 'A'링크를 클릭하고 수백 개의 쿼리를 제외하고 실제 쿼리를 표시하는 방법은 없습니다 .

뷰가 실행하는 실제 쿼리를 어떻게 알 수 있습니까? 뷰가 블록으로 표시됩니다.

답변:


40

hook_views_pre_execute 를 사용 하고 Devel이 설치된 상태 dpq에서 SQL 문자열을 보려면 use 를 사용해야 합니다.

function hook_views_pre_execute(&$view) {
  dpq($view->build_info['query']);
}

감사. 후크 쿼리 페이지에서 "쿼리가 완전히 빌드되었지만 아직 db_rewrite_sql을 통해 실행되지 않았습니다."라는 내용을 읽습니다. 이것은 다른 후크가 실행 전에 SQL을 다시 작성할 가능성이 있음을 의미합니까? 그런 다음 모든 상황에서 실제 쿼리를 얻지 못합니다.
jjei

2
pre_render 가 아마도 최고 일 것이지만, 대부분의 경우 쿼리가 크게 다를 것이라고 확신하지 않습니다.
Countzero

실제로 어떤 경우에는 뷰에 버그가 있다고 생각, 난 그냥 문제를 게시 한 drupal.org/node/1845772을
숀 베니 스터

1
뷰 설정에서 SQL 쿼리 출력을 활성화하면 $ view-> build_info [ 'query']가 동일한 쿼리 뷰인 것처럼 보입니다.
Johnathan Elmore

이것은 쓸모가 없습니다. 예 SELECT users.uid AS uid, users.created AS users_created, users.language AS users_language, users.mail AS users_mail, users.name AS users_name, 'user'AS field_data_field_first_name_user_entity_type, 'user'AS field_data_field_last_name_user_entity_type_user_entity_type_user_entity_type_user_date_type_user_date_type {users} users WHERE ((((users.status <> '0') AND (users.created> 1441641600))) ORDER BY users_created DESC LIMIT 20 OFFSET 0 사용자 필드이며 적절한 결과를 제공하지 않는 "field_data_field_first_name_user_entity_type"이 있습니다. 변경하지 않고.
Marko Blazekovic

4
function hook_views_pre_execute(&$view) {
  if ($view->name == 'XYZ') {
    $query = (string)$view->build_info['query'];
    echo $query;
  }
}

2

패치 나 후크가 필요 없습니다.

// Run the view.
$view = views_get_view('frontpage');
$view->set_display('page');
$view->pre_execute();
$view->execute();

/* Magic Below Here */
// Get query from the view.
$query = $view->query->query();

// Format SelectQueryInterface into a string.
$string = (string) $query;

// Replace arguments.
$arguments = $query->arguments();
if (!empty($arguments) && is_array($arguments)) {
  foreach ($arguments as $placeholder => &$value) {
    if (is_string($value)) {
      $value = "'$value'";
    }
  }
  $string = strtr($string, $arguments);
}

// Format the query string for more readable output.
$string = str_replace(array(' {', "\n{"), ' ', $string);
$string = str_replace(array('} ', "}\n"), ' AS ', $string);
$string = str_replace(', ', ",\n  ", $string);
$string = str_replace(' AND ', "\n  AND ", $string);
$string = str_replace(' ON ', "\n  ON ", $string);
$string = str_replace('SELECT ', "SELECT\n  ", $string);
$string = str_replace('ORDER BY ', "ORDER BY\n  ", $string);

// echo $string;
echo str_replace('  ', '&nbsp;&nbsp;', nl2br($string));

이것을 출력으로 제공

SELECT
  node.sticky AS node_sticky,
  node.created AS node_created,
  node.nid AS nid,
  'frontpage:page' AS view_name
FROM  node AS node
WHERE (( (node.promote <> 0)
  AND (node.status = 1) ))
ORDER BY
  node_sticky DESC,
  node_created DESC
LIMIT 10 OFFSET 0

미안하지만 내 결과는 다릅니다 : SELECT node.nid AS nid, 'node' AS field_data_field_name_node_entity_type, 'node' AS field_data_field_surname_node_entity_type, ecc ...
Leo

도와 줄래?
Leo

1
@ 레오 이걸 실행하려는 관점에 대한 자세한 정보가 필요합니다. 출력은 변경되지 않은 상태에서 첫 페이지보기 용입니다. 프론트 페이지 뷰의 구성을 변경 한 것처럼 들리므로 물론 SQL은 다릅니다.
mikeytown2

답장을 보내 주셔서 감사합니다. 어쩌면이 답변을 스팸하지 않기 위해 질문을 작성하고 아래 링크를 삽입하겠습니다
Leo


1

이 패치를 시도하십시오 :

--- a/sites/all/modules/views/plugins/views_plugin_query_default.inc
+++ b/sites/all/modules/views/plugins/views_plugin_query_default.inc
@@ -1393,6 +1393,19 @@ class views_plugin_query_default extends     views_plugin_query {
           $query->range($offset, $limit);
         }

+        $query_string = (string)$query;
+        $query_string = str_replace('{', '', $query_string);
+        $query_string = str_replace('}', '', $query_string);
+        $query_params = $query->getArguments();
+        foreach($query_params as $placeholder => $value) {
+          if(!is_numeric($value)) {
+            $query_string = str_replace($placeholder, "'$value'",    $query_string);
+          }
+          else {
+            $query_string = str_replace($placeholder, $value, $query_string);
+          }
+        }
+        drupal_set_message($query_string);
         $result = $query->execute();

         $view->result = array();

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.