web-dev-qa-db-ja.com

MySQL / Doctrine2クエリをデバッグする方法は?

私はZend FrameworkでMySQLを使用しています&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$$
24
Jiew Meng

mysql一般クエリログ を使用するのはどうですか?

一般クエリログは、mysqldが実行していることの一般的な記録です。サーバーは、クライアントが接続または切断したときにこのログに情報を書き込み、クライアントから受信した各SQLステートメントをログに記録します。一般的なクエリログは、クライアントのエラーが疑われ、クライアントがmysqldに送信したものを正確に知りたい場合に非常に役立ちます。

6
ajreal

Doctrine 2でクエリをデバッグするための最も簡単なソリューション:

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

DBAL SQLLoggerを使用する必要があります。基本的なネイティブSQLロガー\ Doctrine\DBAL\Logging\EchoSQLLoggerを使用するか、またはDoctrine\DBAL\Logging\SQLLoggerのインターフェイスを使用して独自のSQLロガーを実装できます。

基本的なロガーの場合、SQLロガーをEntityManagerにアタッチする必要があります。したがって、あなたのDoctrine bootstrapファイルの使用:

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

$ connectionParams配列からEntityManagerを作成することに注意してください。

重要:。 EntityManagerの作成にDBAL接続を使用する場合は、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);
12

Doctrine2プロファイラー+ Firebugを使用する

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

5
amree

このトピックに関するブログ記事を書き、プロファイリングをセットアップするためのいくつかの手順を示しましたDoctrine 2 Zend Frameworkで

ZFDebugはすでに非常に優れており、Doctrine 2のプラグインがあります。

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

2
Pete Mitchell

あなたとMySQLサーバーの間でMysqlプロキシを使用してみてください( http://forge.mysql.com/wiki/MySQL_Proxy )。次に、すべての要求をログに記録するようにこのプロキシを構成できます。

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

2
regilero

ZF2で開発している場合は、beberleiによって投稿された上記のソリューションを使用できますが、これはディスプレイにエコー出力しますが、これは正確にはベストプラクティスではありませんが、有用。

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

または、ツールバーに実行クエリを表示する ZendDeveloperTools を使用することもできます。

enter image description here

1
Lionel Morrison

Zend_Db_Profile[開発]環境で使用する必要があるかもしれません。

これにより、ランタイムとその他の情報を使用してクエリがログに記録されます。

例外を記録するエラーログがある場合、すべてがログファイルにあります。

このリンクを参照してください: Zend Enable SQL Query logging

このZend Framework Helperも参照してください: https://github.com/jokkedk/ZFDebug

1
Scriptlabs