#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, если вам это нужно), и все готово.
Лучший подход, вероятно, состоит в том, чтобы поместить каждый объект базы данных в отдельный файл под управлением системы управления версиями (чтобы было проще отслеживать изменения в отдельных объектах), а затем объединить их в один файл в рамках развертывания.