Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1137

SchemaTool#getUpdateSchemaSql() does not respect database identifier in table names

    Details

    • Type: Improvement Improvement
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 2.0.4
    • Fix Version/s: None
    • Component/s: ORM, Tools
    • Security Level: All
    • Labels:
      None
    • Environment:
      Linux 2.6.18-194.32.1.el5.centos.plus x86_64 GNU/Linux

      Description

      Given two databases, 'foo' and 'bar', with entities in /Entities/Foo/ annotated as follows:

      /**
       * Test
       *
       * @Table(name="foo.test")
       * @Entity
       */
      

      Create an EntityManager instance with

      $connectionOptions = array( 
          'dbname' => 'Foo', 
          'driver' => 'pdo_mysql', 
          <..etc..>
      );

      Use EntityManager#getClassMetaData( "Entities\\Foo
      Test" ) to pass to SchemaTool#createSchema() and Doctrine appropriately creates a database table foo.test

      Use EntityManager#getClassMetaData( "Entities\\Foo
      Test" ) to pass to SchemaTool#updateSchema() and Doctrine fails with Exception
      -> SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'test' already exists

      Inserting

      die( print_r( $fromSchema, 1 ) . print_r( $toSchema, 1 ) . print_r( $schemaDiff, 1 ) );

      into Doctrine/ORM/Tools/SchemaTool.php line 632 shows $fromSchema outputs

      [_tables:protected] => Array
              (
                  [test]

      but $toSchema outputs

      [_tables:protected] => Array
              (
                  [foo.test]

      which causes $schemaDiff to output

      [newTables] => Array
              (
                  [foo.test]

      In summary, Doctrine/DBAL/Schema/Comparator considers foo.test a new table, because Doctrine/DBAL/Schema/AbstractSchemaManager lists its table as "test" rather than "foo.test".

        Activity

        Hide
        Benjamin Eberlei added a comment -

        Multi databases are not supported by schema manager and schema tool yet.

        Show
        Benjamin Eberlei added a comment - Multi databases are not supported by schema manager and schema tool yet.
        Hide
        Hugh Lomas added a comment -

        It seems that changing AbstractSchemaManager.php to the following corrected the issue for me, however I am not sure of any repercussions that may arise as a result, being unfamiliar with the codebase.

        Doctrine/DBAL/Schema/AbstractSchemaManager.php line 228

        return new Table( $tableName, $columns, $indexes, $foreignKeys, false, array());

        Doctrine/DBAL/Schema/AbstractSchemaManager.php line 228

        return new Table( $this->_conn->getDatabase() . "." . $tableName, $columns, $indexes, $foreignKeys, false, array());

        Show
        Hugh Lomas added a comment - It seems that changing AbstractSchemaManager.php to the following corrected the issue for me, however I am not sure of any repercussions that may arise as a result, being unfamiliar with the codebase. Doctrine/DBAL/Schema/AbstractSchemaManager.php line 228 return new Table( $tableName, $columns, $indexes, $foreignKeys, false, array()); Doctrine/DBAL/Schema/AbstractSchemaManager.php line 228 return new Table( $this->_conn->getDatabase() . "." . $tableName, $columns, $indexes, $foreignKeys, false, array());

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            Hugh Lomas
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated: