Как я могу скопировать базу данных MySQL в ruby ​​на рельсах? - PullRequest
8 голосов
/ 08 октября 2008

Мы создаем веб-приложение на Ruby On Rails, где каждый клиент получает свою собственную базу данных.
База данных должна быть создана после заполнения формы на нашем сайте.

У нас есть база данных шаблонов, в которой есть все таблицы и столбцы, которые нам нужно скопировать. Как я могу сделать это программно из ruby ​​на рельсах?

Ответы [ 4 ]

10 голосов
/ 08 октября 2008

Я не уверен, что вы имеете в виду, но вы можете использовать функциональность командной строки ruby, чтобы создать дамп базы данных шаблонов, создать новую базу данных и повторно импортировать ее с помощью программы mysqldump :

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

Здесь - хорошее описание запуска параметров командной строки из Ruby.

7 голосов
/ 08 октября 2008

С любого контроллера вы можете определить следующий метод.

 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

Обратите внимание, что я точно не знаю, сохранит ли это целостность ключа. Я думаю, это во многом зависит от того, как создается база данных шаблона.

1 голос
/ 27 октября 2009

Используя yaml_db

Вам необходимо установить плагин, выгрузить любую базу данных rails (включая mysql) в файл data.yml, используя задачу rake, изменить строку подключения, чтобы она указала на новую базу данных, а затем окончательно загрузить data.yml в любую новую базу данных (включая mysql), используя еще одно грабли Очень просто.

0 голосов
/ 08 октября 2008

Вы можете поместить свой код создания схемы шаблона в скрипт, который содержит все необходимые операторы создания таблицы / индекса / представления / процедуры, назвать его «template_schema.sql» или как угодно, а затем просто запустить скрипт в базе данных вашего выбор (от Руби, если это то, что вам нужно) и все готово.

Наилучший подход, вероятно, состоит в том, чтобы каждый объект базы данных в отдельном файле находился под контролем исходного кода (чтобы упростить отслеживание изменений отдельных объектов), а затем объединить их в один файл как часть развертывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...