Tengo varias aplicaciones Rails ejecutándose en un solo servidor MySQL. Todos ejecutan la misma aplicación, y todas las bases de datos tienen el mismo esquema, pero cada base de datos pertenece a un cliente diferente.Manera segura de iterar sobre múltiples bases de datos en Rails
Conceptualmente, esto es lo que quiero hacer:
Customer.all.each do |customer|
connection.execute("use #{customer.database}")
customer.do_some_complex_stuff_with_multiple_models
end
Este enfoque no funciona porque, cuando este se ejecuta en una solicitud web, las clases del modelo subyacentes caché diferentes conexiones de bases de datos de la conexión de A/R piscina. Entonces, la conexión en la que ejecuto la instrucción "use" puede no ser la conexión que utiliza el modelo, en cuyo caso consulta la base de datos incorrecta.
He leído a través del código de Rails A/R (versión 3.0.3), y se acercó con este código a ejecutar en el circuito, en lugar de la "utilización" declaración:
ActiveRecord::Base.clear_active_connections!
ActiveRecord::Base.establish_connection(each_customer_database_config)
creo que el grupo de conexiones es por subproceso, por lo que parece que esto afectaría al grupo de conexiones y lo restablecería solo para el único subproceso en el que está activada la solicitud web. Pero si las conexiones se comparten de alguna manera que no veo, no me gustaría que ese código cause estragos con otras solicitudes web activas en la misma aplicación.
¿Es seguro hacerlo en una aplicación web en ejecución? Hay alguna otra manera de hacer esto?
Solo para aclarar, soporte de MySQL _does_ esquemas SQL, pero originalmente y infelicitously los llamó "bases de datos". La palabra clave SQL "SCHEMA" se reconoce desde la versión 5.0.2 (diciembre de 2004). Decir "USE foo" para MySQL es análogo a establecer una 'ruta_búsqueda' de la conexión PostgreSQL a un solo espacio de nombres" foo ". – pilcrow
Absolutamente. Incluso puede escribir "create schema abc" en lugar de "create database abc" en MYSQL. – Jagira