2015-10-01 35 views
5

Ho un database PG contenente più schemi.Multiple DB Schema e migrazioni con Doctrine2 e PostgreSQL

Ho un'applicazione symfony2 che deve connettersi solo a uno di essi.

Se non configuro nulla, per impostazione predefinita Doctrine2 cerca in tutti gli schemi in modo che tenti di rendere SELECT nella tabella in cui non ha il diritto.

ho seguito questa risposta: symfony2 + [email protected] setting a schema

ora sembra andare solo nel Shema ho specificato, ma è ancora alla ricerca di alcune tabelle non presenti nel mio schema, ma in altri.

Quando eseguo qualcosa ldoctrine: migrazioni: 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"       
              ^  

Quindi seguendo la documentazione di migrazione dottrina, ho aggiunto questa linea nella progettazione del collegamento:

 schema_filter: ~^(?!pgstats)~ 

E ancora sempre provare a fare SELECT in quelle tabelle ...

risposta

0

È necessario l'opzione --db-configuration per il comando migrate. Prende un file di configurazione come argomento. Provare con il seguente contenuto del file di configurazione.

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

Inoltre ho cambiato fornitore/doctrine/dbal/lib/doctrine/DBAL/SchemaPostgreSqlSchemaManager.php anteporre sempre lo schema per i nomi delle sequenze.

come questo:

/** 
* {@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']); 
} 

(aggiunti i veri o entrambi i luoghi in cui ipotizza che nome dello schema = 'pubbliche'!)

+0

Grazie ho intenzione di provare questa soluzione! Hai un'idea di come eseguire l'override di questa classe senza modificare il file nel fornitore? – BastienSander

+0

Non testato, è possibile sovrascrivere getSchemaManager da AbstractPostgresqlDriver per restituire uno SchemaManager personalizzato con le modifiche precedenti. – user993553