微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

如果我没有配置任何东西,认情况下Doctrine2会搜索所有模式,因此它会尝试在表中没有权限的情况下进行SELECT.

我按照这个答案:symfony2 + doctrine2@postgresql setting a schema

现在它似乎只是在我指定的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"                          
                                              ^

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

schema_filter: ~^(?!pgstats)~

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

解决方法

您需要选择–db-configuration to migrate命令.
它将配置文件作为参数.
尝试使用配置文件的以下内容.

<?PHP
return array(
    "driverClass"=>"AppBundle\Driver","host" => "localhost","user" => "test","password" => "test","dbname" => "test"
        );
?>

此外,我更改了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']);
}

(在假定模式名称!=’public’的两个地方添加或者真实)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐