Как отлаживать MySQL/Doctrine2 Queries?
Я использую MySQL с Zend Framework & Doctrine 2. Я думаю, что даже если вы не используете Doctrine 2, вы будете знакомы с такими ошибками, как
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC' at line 1
Проблема в том, что я не вижу полный запрос. Без платформы ORM я, вероятно, мог бы легко повторить sql, но с помощью инфраструктуры, как я могу узнать, какой SQL он пытается выполнить? Я сузил ошибку до
$progress = $task->getProgress();
$progress
объявлен
// Application\Models\Task
/**
* @OneToMany(targetEntity="TaskProgress", mappedBy="task")
* @OrderBy({"seq" = "ASC"})
*/
protected $progress;
В MySQL класс задачи выглядит так
CREATE TABLE `tasks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`owner_id` int(11) DEFAULT NULL,
`assigned_id` int(11) DEFAULT NULL,
`list_id` int(11) DEFAULT NULL,
`name` varchar(60) NOT NULL,
`seq` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `tasks_owner_id_idx` (`owner_id`),
KEY `tasks_assigned_id_idx` (`assigned_id`),
KEY `tasks_list_id_idx` (`list_id`),
CONSTRAINT `tasks_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `users` (`id`),
CONSTRAINT `tasks_ibfk_2` FOREIGN KEY (`assigned_id`) REFERENCES `users` (`id`),
CONSTRAINT `tasks_ibfk_3` FOREIGN KEY (`list_id`) REFERENCES `lists` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1$$
8 ответов
Как насчет использования общего журнала запросов MySQL?
Общий журнал запросов - это общая запись того, что делает mysqld. Сервер записывает информацию в этот журнал, когда клиенты подключаются или отключаются, и регистрирует каждый оператор SQL, полученный от клиентов. Общий журнал запросов может быть очень полезен, когда вы подозреваете ошибку в клиенте и хотите точно знать, что клиент отправил в mysqld.
Самое простое решение для отладки запросов в Doctrine 2:
$em->getConnection()
->getConfiguration()
->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;
Вы должны использовать DBAL SQLLogger. Вы можете использовать базовый собственный SQL Logger \ Doctrine \ DBAL \ Logging \ EchoSQLLogger или реализовать свой с помощью интерфейса Doctrine \ DBAL \ Logging \ SQLLogger.
Для основного регистратора вы должны присоединить регистратор SQL к EntityManager. Итак, в вашем файле загрузки Doctrine используйте:
$config = new Doctrine\ORM\Configuration ();
// ... config stuff
$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
$connectionParams = array(
'dbname' => 'example',
'user' => 'example',
'password' => 'example',
'host' => 'localhost',
'driver' => 'pdo_mysql');
//make the connection through an Array of params ($connectionParams)
$em = EntityManager::create($connectionParams, $config);
Обратите внимание, что мы создаем наш EntityManager из массива $connectionParams.
Важно: Если вы используете соединение DBAL для создания вашего EntityManager, вы должны присоединить его как к соединению DBAL, так и к ORM EntityManager. Например, в Zend Framework,
Ты делаешь это:
$config = new Doctrine\ORM\Configuration ();
// ...config stuff
// LOGGER
$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
// make the connection through DBAL (DriverManager::getConnection)
// note that we attach $config in $connApp(DBAL) and $emApp(ORM)
$connApp = DriverManager::getConnection($connectionParams, $config);
$emApp = EntityManager::create($connApp, $config);
Zend_Registry::set('emApp', $emApp);
Zend_Registry::set('connApp', $connApp);
Используйте Doctrine2 profiler + Firebug
Я написал статью в блоге на эту тему с некоторыми инструкциями по настройке Doctrine 2 для профилирования в Zend Framework.
ZFDebug уже очень хорош, и для него есть плагин Doctrine 2
http://labs.ultravioletdesign.co.uk/profiling-doctrine-2-with-zend-framework/
Если вы разрабатываете в ZF2, вы можете использовать вышеупомянутое решение, опубликованное beberlei, хотя это отражается на вашем дисплее, что не совсем лучшая практика, но полезная.
$em->getConnection()
->getConfiguration()
->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;
или вы можете использовать ZendDeveloperTools, который отображает запрос на выполнение на панели инструментов.
Попробуйте использовать прокси-сервер Mysql между вами и сервером MySQL ( http://forge.mysql.com/wiki/MySQL_Proxy). Затем вы можете настроить этот прокси для регистрации всех запросов.
http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html
Возможно, вам следует использовать Zend_Db_Profile в вашей среде [разработки].
Это будет регистрировать ваши запросы во время выполнения и другую информацию.
Если у вас есть журнал ошибок, в котором записываются ваши исключения, то все можно найти в файлах журналов.
Смотрите эту ссылку: Zend Enable SQL Query logging
Также посмотрите этот Zend Framework Helper: https://github.com/jokkedk/ZFDebug