Подтвердить что ты не робот

Как отлаживать запросы MySQL/Doctrine2?

Я использую 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$$
4b9b3361

Ответ 1

как использовать общий журнал запросов mysql?

Общий журнал запросов - это общая запись того, что делает mysqld. Сервер записывает информацию в этот журнал, когда клиенты подключаются или разъединяются, и регистрирует каждый SQL-запрос, полученный от клиентов. Общий журнал запросов может быть очень полезен, если вы подозреваете ошибку в клиенте и хотите точно знать, что клиент отправил в mysqld.

Ответ 2

Самое простое решение для отладки запросов в Doctrine 2:

$em->getConnection()
  ->getConfiguration()
  ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;

Ответ 3

Вы должны использовать DBAL SQLLogger. Вы можете использовать базовый собственный SQL Logger \Doctrine\DBAL\Logging\EchoSQLLogger, или вы можете реализовать свой интерфейс с помощью Doctrine\DBAL\Logging\SQLLogger.. p >

Для основного регистратора вы должны подключить SQL Logger к 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 Connection, так и к 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);

Ответ 6

Я написал статью в блоге по этому вопросу с некоторыми инструкциями по настройке профилирования Doctrine 2 в Zend Framework

ZFDebug уже очень приятный, и для него есть плагин Doctrine 2

http://labs.ultravioletdesign.co.uk/profiling-doctrine-2-with-zend-framework/

Ответ 7

Если вы разрабатываете в ZF2, вы можете использовать решение выше, размещенное beberlei, хотя это и выводит его на экран, что не совсем точно, но полезно.

$em->getConnection()
  ->getConfiguration()
  ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;

или вы можете использовать ZendDeveloperTools, который отображает запрос выполнения на панели инструментов.

enter image description here

Ответ 8

Возможно, вы должны использовать Zend_Db_Profile в своей среде [разработка].

Это приведет к регистрации ваших запросов со временем выполнения и другими сведениями.

Если у вас есть журнал ошибок, который регистрирует ваши исключения, все можно найти в файлах журнала.

См. эту ссылку: Zend Включить ведение журнала SQL-запросов

Также см. этот помощник Zend Framework: https://github.com/jokkedk/ZFDebug