en Rails, ¿cómo puedo ejecutar directa de código SQL en una base de datos diferente?

StackOverflow https://stackoverflow.com/questions/80859

Pregunta

Aquí es el caso.

Estoy escribiendo una aplicación Rails que se encargará de vigilar la calidad de los datos a través de algunas bases de datos específicas.Con el fin de hacer eso, tengo que ser capaz de ejecutar directa consultas SQL sobre estas bases de datos que, por supuesto, no son el mismo que el usado para la unidad de los Rieles de la aplicación de los modelos.En resumen, esto significa que no puede usar el truco de ir a través de la ActiveRecord base de conexión.

Las bases de datos que se necesita para conectarse a no se conoce en tiempo de diseño (es decir:Yo no puedo poner sus datos en la base de datos.yaml).Más bien, tengo un modelo de 'database_details', que el usuario va a utilizar para entrar en los detalles de las bases de datos sobre la que se ejecutará la aplicación de las consultas en tiempo de ejecución.
Así, la conexión a estas bases de datos es realmente dinámico y los detalles se resuelven en tiempo de ejecución sólo.

¿Cómo puedo hacer eso?

Gracias,
Rollo

¿Fue útil?

Solución

Tuve una situación como esta en la que me tenía que conectar a cientos de diferentes instancias de una aplicación externa, y yo hice un código similar al siguiente:

  def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

Esto tiene el beneficio añadido de no cambiar su ActiveRecord::Base de conexión que los modelos heredan, por lo que puede ejecutar SQL en contra de esta conexión y descartar el objeto cuando haya terminado con él.

Otros consejos

Mediante programación puede establecer la conexión mediante una llamada como esta

ActiveRecord::Base.establish_connection(
   :adapter  => "mysql",
   :host     => "localhost",
   :username => "myuser",
   :password => "mypass",
   :database => "somedatabase"
)

Como se puede ver se puede reemplazar el somedatabase por un database_model.database_name valor.mismo con el adatpter y todos los

ActiveRecord::Base.establish_connection documentación

A continuación, puede utilizar

ActiveRecord::Base.find_by_sql("select * ") 

para ejecutar una consulta sql.

ActiveRecord::Base.find_by_sql documentación

El Señor Matt fue a la derecha si está incompleta

Más información (anticuado, pero todavía útil para el enfoque de diseño) puede ser encontrado aquí y recuerde volver a conectar a la base de datos normal cuando termines :)

Usted puede ser capaz de hacer esto a través de auto.establish_connection

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top