Как я могу скопировать базу данных MySQL в ruby on rails?

#mysql #ruby-on-rails #ruby #database

Вопрос:

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

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

Ответ №1:

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

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

Вот хорошее описание вызова параметров командной строки из Ruby.

Комментарии:

1. Я действительно опасаюсь необходимости обращаться к оболочке для вещей, которые можно сделать внутри кода. Я не хочу вводить ненужную зависимость. Но ссылка, которую вы предоставили, была очень полезна для чего-то совершенно не связанного.

Ответ №2:

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

  def copy_template_database
        template_name = "customerdb1" # Database to copy from
        new_name = "temp" #database to create amp; 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
 

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

Ответ №3:

С помощью yaml_db

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

Ответ №4:

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

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