2015-10-01 19 views
5

複数のスキーマを含むPGデータベースがあります。Doctrine2とPostgreSQLを使用した複数のDBスキーマと移行

私はsymfony2アプリケーションを1つだけに接続する必要があります。

何も設定しない場合、デフォルトでDoctrine2はすべてのスキーマを検索して、テーブルにSELECTを作成しようとします。

symfony2 + [email protected] setting a schemaは、今では私が指定したシェマにだけ行くように見えるが、それはまだ私のスキーマに存在するが、他のもので、いくつかのテーブルを探しています:

私はこの答えを追いました。

私は何かのldoctrineを実行します。移行:デフ

[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"       
              ^  

だから教義の移行のドキュメント以下、Iは、接続構成にこの行を追加:

 schema_filter: ~^(?!pgstats)~ 

をそれはまだ常にSELECTを作ってみますこれらの表では...

答えて

0

migrateコマンドには、--db-configurationオプションが必要です。 引数として構成ファイルをとります。 次の構成ファイルの内容を試してください。

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

はさらに私は常にシーケンス名にスキーマを付加するために、ベンダー/ドクトリン/ DBAL/libに/ドクトリン/ 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']); 
} 

は(そのスキーマ名を想定したり、真の両方の場所を追加=「パブリック」!)私は、このソリューションをテストするつもりです

+0

感謝を! ベンダーのファイルを変更せずにこのクラスをオーバーライドする方法について考えていますか? – BastienSander

+0

テストされていませんが、AbstractPostgresqlDriverからgetSchemaManagerをオーバーライドして、上記の変更を加えたカスタムSchemaManagerを返すことができます。 – user993553

関連する問題