web-dev-qa-db-fra.com

Comment déboguer les requêtes MySQL / Doctrine2?

J'utilise MySQL avec Zend Framework & Doctrine 2. Je pense que même si vous n'utilisez pas Doctrine 2, vous serez familier avec des erreurs comme

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

Le problème est que je ne vois pas la requête complète. Sans framework ORM, je pourrais probablement faire écho au sql facilement, mais avec un framework, comment puis-je savoir quel SQL il essaie d'exécuter? J'ai réduit l'erreur à

$progress = $task->getProgress();

$progress est déclaré

// Application\Models\Task
/**
 * @OneToMany(targetEntity="TaskProgress", mappedBy="task")
 * @OrderBy({"seq" = "ASC"})
 */
protected $progress;

Dans MySQL, la classe de tâches ressemble à

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$$
24
Jiew Meng

que diriez-vous d'utiliser journal des requêtes générales mysql ?

Le journal général des requêtes est un enregistrement général de ce que fait mysqld. Le serveur écrit des informations dans ce journal lorsque les clients se connectent ou se déconnectent, et il enregistre chaque instruction SQL reçue des clients. Le journal général des requêtes peut être très utile lorsque vous suspectez une erreur dans un client et que vous voulez savoir exactement ce que le client a envoyé à mysqld.

6
ajreal

Solution la plus simple pour déboguer les requêtes dans Doctrine 2:

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

Vous devez utiliser un DBAL SQLLogger. Vous pouvez utiliser le SQL Logger natif de base \ Doctrine\DBAL\Logging\EchoSQLLogger, ou vous pouvez implémenter le vôtre avec une interface de Doctrine\DBAL\Logging\SQLLogger.

Pour l'enregistreur de base, vous devez attacher l'enregistreur SQL à EntityManager. Donc, dans votre fichier Doctrine bootstrap use:

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

Notez que nous créons notre EntityManager à partir du tableau $ connectionParams.

Important:. Si vous utilisez une connexion DBAL pour créer votre EntityManager, vous devez l'attacher dans les deux, la connexion DBAL et l'ORM EntityManager. Par exemple, dans Zend Framework,

Tu fais cela:

$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);
12
Rowinson Gallego

Utiliser le profileur Doctrine2 + Firebug

https://github.com/mridgway/ZendX_Doctrine2/

5
amree

J'ai écrit un article de blog sur ce sujet avec quelques instructions pour configurer le profilage Doctrine 2 dans Zend Framework

ZFDebug est déjà très sympa, et il y a un Doctrine 2 plugin pour ça

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

2
Pete Mitchell

Essayez d'utiliser le proxy Mysql entre vous et le serveur MySQL ( http://forge.mysql.com/wiki/MySQL_Proxy ). Vous pouvez ensuite configurer ce proxy pour enregistrer toutes les demandes.

http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html

2
regilero

Si vous développez en ZF2, vous pouvez utiliser la solution ci-dessus publiée par beberlei , bien que cela se répercute sur votre écran, ce qui n'est pas exactement la meilleure pratique mais utile.

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

ou vous pouvez utiliser ZendDeveloperTools qui affiche la requête d'exécution sur la barre d'outils.

enter image description here

1
Lionel Morrison

Vous devriez peut-être utiliser un Zend_Db_Profile dans votre [développement] environnement.

Cela enregistrera vos requêtes avec l'exécution et d'autres informations.

Si vous avez un journal des erreurs qui enregistre vos exceptions, tout se trouve dans vos fichiers journaux.

Voir ce lien: Zend Activer la journalisation des requêtes SQL

Voir également cet assistant Zend Framework: https://github.com/jokkedk/ZFDebug

1
Scriptlabs