Ottieni la query effettiva eseguita da una vista


23

Ho bisogno di scoprire la query SQL che viene eseguita da una determinata query. Il modulo Viste può mostrare l'SQL durante la configurazione della vista ma apparentemente la query non è la query effettiva che viene eseguita in tutti i casi .
Sono consapevole che il modulo Devel può mostrare le query del database, ma con devel non è possibile mostrare le query effettive se non facendo clic sul collegamento "A" associato con ogni query e ce ne sono centinaia .

Come posso scoprire la query effettiva che la vista esegue? La vista viene visualizzata come un blocco.

Risposte:


40

Devi usare hook_views_pre_execute e con Develop installato utilizzare dpqper visualizzare la stringa SQL:

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

Grazie. Nella pagina dell'API hook si legge che "La query è ora completamente compilata, ma non è ancora stata eseguita tramite db_rewrite_sql." Questo significa che esiste la possibilità che qualche altro hook possa riscrivere sql prima della sua esecuzione? Quindi non otterrei la query effettiva in tutte le situazioni.
jjei,

2
pre_render è probabilmente il migliore, ma non sono sicuro che la query sarà molto diversa nella maggior parte dei casi.
Countzero,

In realtà penso che ci sia un bug in Views in alcuni casi, ho appena pubblicato un problema drupal.org/node/1845772
Sean Bannister il

1
$ view-> build_info ['query'] sembra essere la stessa query che Views visualizza se si abilita l'output di query SQL nelle impostazioni di Views.
Johnathan Elmore

Questo è inutile. Esempio Selezionare users.uid AS UID users.created AS users_created, users.language AS users_language, users.mail AS users_mail, users.name AS USERS_NAME, 'utente' AS field_data_field_first_name_user_entity_type, 'utente' AS field_data_field_last_name_user_entity_type, 'utente' COME DA field_data_field_date_of_birth_user_entity_type {utenti} utenti DOVE (((users.status <> '0') AND (users.created> 1441641600))) ORDINA PER Users_created DESC LIMIT 20 OFFSET 0 Ho "field_data_field_first_name_user_entity_type" che è campo utente e in cui non dà risultati corretti senza alterazioni.
Marko Blazekovic,

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

2

Non sono necessarie patch o ganci.

// 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));

Dà questo come output

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

Mi dispiace, ma la mia produzione è diversa: 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,

Mi potete aiutare?
Leone,

1
@Leo Ho bisogno di maggiori informazioni su quale vista stai provando a eseguire questo. L'output è per la vista in prima pagina out of the box inalterato; sembra che tu abbia modificato la configurazione della vista in prima pagina, quindi ovviamente l'SQL sarà diverso.
mikeytown2,

Grazie per avermi risposto, forse creerò una domanda e inserirò il link qui sotto, al fine di non inviare spam a questa risposta
Leone,

il link della domanda, spero di essere stato chiaro drupal.stackexchange.com/questions/270994/…
Leo,

1

Prova questa patch:

--- 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();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.