読者です 読者をやめる 読者になる 読者になる

UUUM攻殻機動隊

UUUMのエンジニアによる技術ブログです

Doctrine DBAL 2.5でdoctrine:database:dropするにはDBサーバのバージョンの設定が必要

Symfony Database

nazoです。

Doctrine DBALを2.4で使っていたのですが、2.5にすると、データベース削除コマンドであるdoctrine:database:dropが、以下のようにif-existsをつけていてもエラーが出るようになってしまいました。

% app/console doctrine:database:drop --if-exists


  [Doctrine\DBAL\Exception\ConnectionException]
  An exception occured in driver: SQLSTATE[HY000] [1049] Unknown database 'dbname'



  [Doctrine\DBAL\Driver\PDOException]
  SQLSTATE[HY000] [1049] Unknown database 'dbname'



  [PDOException]
  SQLSTATE[HY000] [1049] Unknown database 'dbname'

issueを探してみると、「(データベースサーバの)バージョン指定しないと駄目だよ」というのを見つけました。Symfony側のドキュメントにも書いてあるようです

Doctrine DBAL 2.5からは、DBサーバのバージョンが指定されていない場合は、自動取得するようになり、その際に接続を作りに行く時に先に接続してしまうので、エラーになってしまうという挙動のようです。

この挙動自体がバグなのかどうかは不明ですが、どちらにしてもバージョンを事前に指定しておくことによって、バージョンを自動取得することがなくなり高速化に繋がるようなので、指定しておいたほうがいいかと思います。

バージョンの指定方法は、Symfonyのドキュメントにも書いてありますが、以下のような書き方になります。

doctrine:
    dbal:
        default_connection:       default
        connections:
            default:
                dbname:           Symfony
                user:             root
                password:         null
                host:             localhost
                server_version:   5.6      # ここでバージョンを指定

Doctrine DBALを最新にして同様の症状で困った場合は参考にしてください。