我们正在制作一个Ruby On Rails webapp,每个客户都可以获得自己的数据库 数据库需要在我们的网站上填写表格后创建。
我们有一个模板数据库,其中包含我们需要复制的所有表和列。我怎么能以编程方式从ruby on rails上做到这一点?
答案 0 :(得分:10)
我不确定您的意思,但您可以使用ruby的命令行功能转储模板数据库,创建新数据库并使用mysqldump程序重新导入它:
> mysqldump -uroot -proot templateDB > dump.sql
> mysql -uroot -proot --execute="CREATE DATABASE newDB"
> mysql -uroot -proot newDB < dump.sql
Here是从Ruby调用命令行选项的一个很好的描述。
答案 1 :(得分:7)
您可以从任何控制器定义以下方法。
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
请注意,我不确定这是否会保持foriegn密钥的完整性。我认为这很大程度上取决于模板数据库的创建方式。
答案 2 :(得分:1)
使用yaml_db
你需要安装插件,使用rake任务将任何rails数据库(包括mysql)转储到data.yml文件中,将连接字符串更改为指向新数据库,然后最终将data.yml加载到任何新数据库(包括mysql)中另一个佣金任务。非常直截了当。
答案 3 :(得分:0)
您可以将模板架构创建代码放入一个脚本中,该脚本包含所有必需的表/索引/视图/过程创建语句,称之为“template_schema.sql”或其他任何内容,然后只需在您的数据库上运行脚本选择(来自Ruby,如果这就是你所追求的)并且你已经完成了。
最好的方法可能是将每个数据库对象放在源代码控制下的单独文件中(以便跟踪单个对象的更改),然后将它们合并到单个文件中作为部署的一部分。