2008-10-07 17 views
8

Estamos creando una aplicación web de Ruby On Rails en la que cada cliente obtiene su propia base de datos.
La base de datos debe crearse después de que completen un formulario en nuestro sitio web.¿Cómo puedo copiar una base de datos mySQL en ruby ​​on rails?

Tenemos una base de datos de plantillas que tiene todas las tablas y columnas que necesitamos copiar. ¿Cómo puedo hacer esto programáticamente desde ruby ​​on rails?

Respuesta

7

Desde cualquier controlador, puede definir el siguiente método.

def copy_template_database 
     template_name = "customerdb1" # Database to copy from 
     new_name = "temp" #database to create & copy to 

     #connect to template database to copy. Note that this will override any previous 
     #connections for all Models that inherit from ActiveRecord::Base 
     ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => template_name, :host => "olddev", 
     :username => "root", :password => "password" }) 

     sql_connection = ActiveRecord::Base.connection 
     sql_connection.execute("CREATE DATABASE #{new_name} CHARACTER SET latin1 COLLATE latin1_general_ci") 
     tables = sql_connection.select_all("Show Tables") 
     #the results are an array of hashes, ie: 
     # [{"table_from_customerdb1" => "customers"},{"table_from_customerdb1" => "employees},...] 
     table_names = Array.new 
     tables.each { |hash| hash.each_value { |name| table_names << name }} 

     table_names.each { |name| 
      sql_connection.execute("CREATE TABLE #{new_name}.#{name} LIKE #{template_name}.#{name}") 
      sql_connection.execute("INSERT INTO #{new_name}.#{name} SELECT * FROM #{template_name}.#{name}") 
     } 
     #This statement is optional. It connects ActiveRecord to the new database 
     ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev", 
     :username => "root", :password => "password" }) 
    end 

Tenga en cuenta que no estoy seguro si esto mantendrá la integridad de la llave foriegn. Creo que depende mucho de cómo se crea la plantilla de la base de datos.

0

Puede poner su código de creación de esquema de plantilla en un script que contenga todas las instrucciones de creación de tabla/índice/vista/procedimiento requeridas, llámelo "template_schema.sql" o lo que sea y luego ejecute el script en la base de datos de su elección (de Ruby, si eso es lo que busca) y listo.

El mejor enfoque es tener cada objeto de base de datos en un archivo separado bajo control de origen (para facilitar el seguimiento de los cambios en objetos individuales) y luego fusionarlos en un solo archivo como parte de la implementación.

10

no estoy seguro de lo que quieres decir, pero se puede utilizar la funcionalidad de línea de comandos de rubí para volcar la base de datos de plantilla, cree una nueva base de datos y vuelva a importar que el uso del programa mysqldump:

> mysqldump -uroot -proot templateDB > dump.sql 
> mysql -uroot -proot --execute="CREATE DATABASE newDB" 
> mysql -uroot -proot newDB < dump.sql 

Here es una buena descripción de invocar opciones de línea de comando de Ruby.

+0

Esa es información útil. Gracias. – Tilendor

+0

¿Mi respuesta ha funcionado para usted? o al menos ayuda? – abarax

+0

Soy muy cuidadoso de tener que ir al shell por cosas que se pueden hacer dentro del código. No quiero introducir una dependencia innecesaria. Pero el enlace que brindó fue muy útil para algo completamente diferente. – Tilendor

1

Mediante el uso de yaml_db

Necesita instalar plug-in, volcar cualquier base de datos carriles (incluyendo MySQL) en data.yml archivo usando tarea rastrillo, el cambio de cadena de conexión para que apunte a nueva base de datos y luego cargar finaly data.yml en cualquier base de datos nueva (incluyendo mysql) usando otra tarea de rake. Muy sencillo.

Cuestiones relacionadas