2011-07-27 16 views
5

Tengo 2 bases de datos db1 y db2 en symfony2 + doctrine2 y ambas bases de datos son diferentes entre sí en términos de tablas y sus campos. Necesito trabajar en la migración. Las cosas funcionan bien siempre y cuando haya una base de datos. Pero no funciona cuando hay más de una base de datos.Migración de bases de datos múltiples usando doctrine2 con Symfony2

También, hay alguna forma en que puedo proporcionar la configuración de migración específica del administrador de entidades. O hay alguna manera a través de la cual puedo proporcionar la conexión o el administrador de entidades en la clase de migración.

Amablemente ayuda.

Gracias ..

Respuesta

9

Usted puede proporcionar un EntityManager utilizando --em = opción de nombre en la tarea de migración. También agrego esta pieza de código, para evitar la ejecución de la migración en otra db por error:

$parameters = $this->connection->getParams(); 
    $this->skipIf(
     $parameters['dbname'] != "my_db_name" 
     'This is the other DB\'s migration, pass a correct --em parameter' 
    ); 

no he encontrado ninguna otra manera de comprobar la EM, así que no puedo ayudarle si sus bases de datos tener los mismos nombres

También tenga en cuenta que debe agregar skipIf a todas sus migraciones, para que pueda migrar sin preocupaciones en ambas bases de datos.

+1

El único problema que encontré con este enfoque es que si utiliza diferentes nombres db sobre el desarrollo, prueba, puesta en escena y la producción hay que añadir múltiples condiciones Sería más fácil si pudiéramos tener acceso al parámetro entityManager. – Sergi

1

Esta pregunta es un poco vieja, pero surgió primero cuando preguntaba lo mismo. Encontré mi respuesta en el Doctrine migrations configuration docs. Digamos que usted tiene conexiones para dos bases de datos, cada uno con sus propios gestores de entidad (mapeados aquí con XML, no anotaciones, y no de auto asignan por lo que las configuraciones de esquema pueden vivir en el mismo camino config/doctrine):

# config.yml 
doctrine: 
dbal: 
    default_connection: default 
    connections: 
     default: 
      driver: '%database_driver%' 
      ... 
     special: 
      driver: '%special_database_driver%' 
orm: 
    entity_managers: 
     default: 
      auto_mapping: false 
      mappings: 
       base: 
        type: xml 
        dir: '%kernel.root_dir%/../src/MyBundle/Resources/config/doctrine/base' 
        prefix: MyBundle\Entity 
        alias: Base 
        is_bundle: false 
     special: 
      auto_mapping: false 
      connection: special 
      mappings: 
       special: 
        type: xml 
        dir: '%kernel.root_dir%/../src/MyBundle/Resources/config/doctrine/special' 
        prefix: MyBundle\Special 
        alias: Special 
        is_bundle: false 

A continuación, no incluyen las configuraciones doctrine_migrations en config.yml. En su lugar, crear un archivo de configuración para cada uno:

# src/MyBundle/Resources/config/migrations/base.yml 
name: BaseMigrations 
migrations_namespace: MyBundle\Migrations\Base 
table_name: Migrations 
migrations_directory: src/MyBundle/Migrations/Base 

# src/MyBundle/Resources/config/migrations/special.yml 
name: SpecialMigrations 
migrations_namespace: MyBundle\Migrations\Special 
table_name: Migrations 
migrations_directory: src/MyBundle/Migrations/Special 

Entonces, cada vez que ejecute cualquier comando de migración, especifique tanto el gestor de la entidad y la configuración:

bin/console doctrine:migrations:status --env=dev --em=special --configuration=src/MyBundle/Resources/config/migrations/special.yml 

Es un poco para recordar si se ejecuta con la mano , por lo que es posible que desee envolverlos en su propio comando para facilitar la vida (por ejemplo, algo así como bin/console my:migrations:status --env=dev --db=special). Tampoco es un problema si usted tiene un script de despliegue fiesta, como:

#!/bin/bash 
ENVIRONMENT="$1" 

# Run migrations for a configuration 
function runMigrations() 
{ 
    local CONFIG="$1" 
    local MANAGER="$2" 
    local STATUS="$(bin/console doctrine:migrations:status --env=${ENVIRONMENT} --configuration=${CONFIG} --em=${MANAGER})" 

    case "${STATUS}" in 
     *"Already at latest version"*) 
      # Do nothing 
      ;; 
     *) 
      runNextMigration $CONFIG $MANAGER 
      ;; 
    esac 
} 

# Run the next migration for a configuration 
function runNextMigration() 
{ 
    local CONFIG="$1" 
    local MANAGER="$2" 
    bin/console doctrine:migrations:migrate next --env=$ENVIRONMENT --configuration=$CONFIG --em=$MANAGER 

    runMigrations $CONFIG $MANAGER 
} 

runMigrations "src/MyBundle/Resources/config/migrations/base.yml" "default" 
runMigrations "src/MyBundle/Resources/config/migrations/special.yml" "special" 
Cuestiones relacionadas