2011-07-08 24 views
7

Estoy tratando de utilizar una conexión de base de datos secundaria para algunos de mis migraciones de la siguiente manera:conexiones de bases de datos múltiples: schema_migrations se busca en la base de datos incorrecta

# app/models/staging/migration.rb 
class Staging::Migration < ActiveRecord::Migration 
    def self.connection 
     ActiveRecord::Base.establish_connection(:staging_db).connection 
    end 
end 

# db/migrate/<timestamp>_create_foo.rb 
class CreateFoo < Staging::Migration 
    .... 
end 

En mi database.yml la conexión es staging_db configurado.

Cuando ejecuto rake db: migrate, la tabla foo se crea correctamente en el esquema staging_db, y la tabla schema_migrations se crea en RAILS_ENV = conexión de desarrollo. Sin embargo db: migrate informes el siguiente error (que no migraciones posteriores):

no existe '' staging_db.schema_migrations Tabla

¿Hay una manera de contar estadificación :: Migración para mirar para la tabla schema_migrations en la conexión actual RAILS_ENV?

BTW, soy consciente del hecho de que staging_db no es RAILS_ENV-aware. Esto está bien para mí ya que cada servidor tiene su entorno configurado a través de una base de datos separada .yml que no está en mi repositorio.

Respuesta

0

ya lo hice, pero fuera de los carriles, que no debería ser muy diferente en los carriles, aquí es cómo lo hago:

Lo primero es conectar su base de datos antes de ejecutar sus migraciones, en los carriles de la mejor lugar puede estar en un inicializador:

MyModel.establish_connection({ 
    :adapter => "mysql2", 
    :database => "mydb", 
    :username => "root", 
    :encoding => 'utf8' 
}) 

el hash se suelen cargar desde un archivo yml pero este es el resultado que desea al final.
MyModel puede ser una clase abstracta si tiene varios modelos en esta base de datos.

Siguiente en la migración cuando se desea migrar esta base de datos sólo tienes que hacer esto:

class DoDomething < ActiveRecord::Migration 
    def self.connection 
    MyModel.connection 
    end 

    def self.up 
    add_column [...] 
    end 
end 

Una cosa a tener en cuenta al hacer las cosas de esta manera es que sólo habrá una mesa schema_migrations y será estar en la base de datos "principal".

4

Usted debe tratar de hacer esto antes de su primera migración en el staging_db:

ActiveRecord::Base.connection.initialize_schema_migrations_table 

Esto creará una tabla de migración de esquema en el PP puesta en escena. Si esto no es lo que quieres, tendrás que manipular algunas otras cosas. El schema_migrations_table_name determina qué tabla contiene las versiones de migración:

def schema_migrations_table_name 
    Base.table_name_prefix + 'schema_migrations' + Base.table_name_suffix 
end 

Así que si usted tiene un table_name_prefix define que hará que el schema_migration_table para buscar en la base de datos puesta en escena.

Cuestiones relacionadas