Ver índice de contenidos del libro

6.2. Depurando las sentencias SQL generadas por Propel

Como en las aplicaciones Symfony no escribes las sentencias SQL a mano, Propel tiene en cuenta las diferencias entre los gestores de bases de datos para generar sentencias SQL optimizadas para la base de datos que elegiste durante el tutorial del día 3. Aun así, en ocasiones es necesario ver las sentencias SQL generadas por Propel, por ejemplo para descubrir por qué no funciona una consulta determinada.

En el entorno dev, Symfony guarda todas estas sentencias (y mucha otra información) en los archivos de log que se encuentran en el directorio log/. Por cada combinación de aplicación y entorno se crea un archivo de log. Por tanto, el archivo en el que tenemos que buscar se llama frontend_dev.log:

# log/frontend_dev.log
Dec 6 15:47:12 symfony [debug] {sfPropelLogger} exec: SET NAMES 'utf8'
Dec 6 15:47:12 symfony [debug] {sfPropelLogger} prepare: SELECT jobeet_job.ID, jobeet_job.CATEGORY_ID, jobeet_job.TYPE, jobeet_job.COMPANY, jobeet_job.LOGO, jobeet_job.URL, jobeet_job.POSITION, jobeet_job.LOCATION, jobeet_job.DESCRIPTION, jobeet_job.HOW_TO_APPLY, jobeet_job.TOKEN, jobeet_job.IS_PUBLIC, jobeet_job.CREATED_AT, jobeet_job.UPDATED_AT FROM `jobeet_job` WHERE jobeet_job.CREATED_AT>:p1
Dec 6 15:47:12 symfony [debug] {sfPropelLogger} Binding '2008-11-06 15:47:12' at position :p1 w/ PDO type PDO::PARAM_STR

A partir de los mensajes anteriores es inmediato comprobar que Propel ha incluido una condición de tipo WHERE para la columna created_at (WHERE jobeet_job.CREATED_AT > :p1).

Nota La cadena de texto :p1 indica que Propel genera sentencias preparadas o "prepared statements". El valor por el que se sustituye :p1 (en este caso, 2008-11-06 15:47:12) se pasa durante la ejecución de la sentencia y se le aplica el mecanismo de escape de la base de datos. Utilizar sentencias preparadas reduce drásticamente la posibilidad de sufrir ataques de tipo SQL injection.

Aunque toda la información está disponible en los archivos de log, es un poco aburrido alternar entre el navegador, el entorno de desarrollo y los archivos de log cada vez que se quiere probar un cambio. Afortunadamente, gracias a la barra de depuración web de Symfony, toda la información necesaria está disponible directamente dentro del navegador:

Sentencias SQL en la barra de depuración web

Figura 6.1 Sentencias SQL en la barra de depuración web