2015-10-01 78 views
5

我有一個包含多個模式的PG數據庫。使用Doctrine2和PostgreSQL進行多數據庫模式和遷移

我有一個symfony2應用程序需要連接到其中只有一個。

如果我沒有配置任何東西,默認情況下,Doctrine2在所有模式中搜索,所以它試圖在沒有合適的表上創建SELECT

我也跟着這樣的回答:symfony2 + [email protected] setting a schema

現在看來只有走在我指定的瑪,但它仍然在尋找一些表在我的架構不存在,但在其他的。

當我執行什麼ldoctrine:遷移: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在那些表中...

回答

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

相關問題