使用Doctrine2和PostgreSQL进行多个DB Schema和迁移

Bas*_*der 5 postgresql schema pdo symfony doctrine-orm

我有一个包含多个模式的PG数据库.

我有一个symfony2应用程序,只需要连接其中一个.

如果我没有配置任何东西,默认情况下Doctrine2会在所有模式中进行搜索,因此它会尝试SELECT在桌面上进行不正确的操作.

我按照这个答案:symfony2 + doctrine2 @ postgresql设置架构

现在它似乎只是在我指定的shema中,但它仍然在寻找我的模式中没有的一些表,但在其他表中.

当我执行ldoctrine:migrations:diff时

[Doctrine\DBAL\DBALException]                                                                     
  An exception occurred while executing 'SELECT min_value, increment_by FROM "pgstatspacknameid"':  
  SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "pgstatspacknameid" does not exist           
  LINE 1: SELECT min_value, increment_by FROM "pgstatspacknameid"                                   
                                              ^                                                     

  [PDOException]                                                                           
  SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "pgstatspacknameid" does not exist  
  LINE 1: SELECT min_value, increment_by FROM "pgstatspacknameid"                          
                                              ^      
Run Code Online (Sandbox Code Playgroud)

因此,遵循学说迁移文档,我在连接配置中添加了这一行:

        schema_filter: ~^(?!pgstats)~
Run Code Online (Sandbox Code Playgroud)

它总是试图SELECT在那些表格中制作......

use*_*553 0

您需要使用 migrate 命令的 --db-configuration 选项。它需要一个配置文件作为参数。尝试使用配置文件的以下内容。

<?php
return array(
    "driverClass"=>"AppBundle\Driver",
    "host" => "localhost",
    "user" => "test",
    "password" => "test",
    "dbname" => "test"
        );
?>
Run Code Online (Sandbox Code Playgroud)

此外,我更改了vendor/doctrine/dbal/lib/Doctrine/DBAL/SchemaPostgreSqlSchemaManager.php,以始终将模式添加到序列名称之前。

像这样:

/**
 * {@inheritdoc}
 */
protected function _getPortableSequencesList($sequences)
{
    $sequenceDefinitions = array();
    foreach ($sequences as $sequence) {//+ || true
        if ($sequence['schemaname'] != 'public' || true) {
            $sequenceName = $sequence['schemaname'] . "." . $sequence['relname'];
        } else {
            $sequenceName = $sequence['relname'];
        }

        $sequenceDefinitions[$sequenceName] = $sequence;
    }
    $list = array();

    foreach ($this->filterAssetNames(array_keys($sequenceDefinitions)) as $sequenceName) {
        $list[] = $this->_getPortableSequenceDefinition($sequenceDefinitions[$sequenceName]);
    }
    return $list;
}

/**
 * {@inheritdoc}
 */
protected function getPortableNamespaceDefinition(array $namespace)
{
    return $namespace['nspname'];
}

/**
 * {@inheritdoc}
 */
protected function _getPortableSequenceDefinition($sequence)
{//+ || true
    if ($sequence['schemaname'] != 'public' || true) {
        $sequenceName = $sequence['schemaname'] . "." . $sequence['relname'];
    } else {
        $sequenceName = $sequence['relname'];
    }

    $data = $this->_conn->fetchAll('SELECT min_value, increment_by FROM ' . $this->_platform->quoteIdentifier($sequenceName));

    return new Sequence($sequenceName, $data[0]['increment_by'], $data[0]['min_value']);
}
Run Code Online (Sandbox Code Playgroud)

(在假定模式名称 != 'public' 的两个地方添加了 or true )