Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在RubyonRails中复制mySQL数据库?_Mysql_Ruby On Rails_Ruby_Database - Fatal编程技术网

如何在RubyonRails中复制mySQL数据库?

如何在RubyonRails中复制mySQL数据库?,mysql,ruby-on-rails,ruby,database,Mysql,Ruby On Rails,Ruby,Database,我们正在制作一个Ruby On Rails Web应用程序,每个客户都可以从中获得自己的数据库。 数据库需要在他们填写我们网站上的表格后创建 我们有一个模板数据库,其中包含我们需要复制的所有表和列。如何从RubyonRails以编程方式实现这一点?从任何控制器,您都可以定义以下方法 def copy_template_database template_name = "customerdb1" # Database to copy from new_name =

我们正在制作一个Ruby On Rails Web应用程序,每个客户都可以从中获得自己的数据库。
数据库需要在他们填写我们网站上的表格后创建


我们有一个模板数据库,其中包含我们需要复制的所有表和列。如何从RubyonRails以编程方式实现这一点?

从任何控制器,您都可以定义以下方法

 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
def copy_template_数据库
模板_name=“customerdb1”#要从中复制的数据库
新建_name=“temp”#要创建并复制到的数据库
#连接到要复制的模板数据库。请注意,这将覆盖任何以前的设置
#从ActiveRecord::Base继承的所有模型的连接
ActiveRecord::Base.building_连接({:适配器=>“mysql”,:数据库=>模板名称,:主机=>“olddev”,
:username=>“root”,:password=>“password”})
sql\u connection=ActiveRecord::Base.connection
sql#u connection.execute(“创建数据库#{new_name}字符集latin1 COLLATE latin1_general_ci”)
tables=sql\u连接。选择所有(“显示表”)
#结果是一个哈希数组,即:
#[{“来自客户的表格”=>“客户”},{“来自客户的表格”=>“员工”},]
表_name=Array.new
tables.each{| hash | hash.each|u值{| name | table|u名称“mysql”,:database=>new|u name,:host=>olddev,
:username=>“root”,:password=>“password”})
结束

请注意,我不确定这是否会保持外键完整性。我认为这在很大程度上取决于模板数据库的创建方式。

您可以将模板架构创建代码放入包含所有必需的表/索引/视图/过程创建语句的脚本中,称之为“template\u schema.sql”“或者随便什么,然后在您选择的数据库上运行脚本(如果您想要的是Ruby),就完成了


最好的方法可能是将每个数据库对象放在一个单独的文件中,并受源代码管理(以便于跟踪单个对象上的更改)然后将它们合并到一个文件中作为部署的一部分。

我不确定您的意思,但您可以使用ruby的命令行功能转储模板数据库,创建新数据库,然后使用程序重新导入它:

mysqldump-uroot-proot templateDB>dump.sql >mysql-uroot-proot--execute=“创建数据库newDB” >mysql-uroot-proot newDB 是对从Ruby调用命令行选项的良好描述。

使用


您需要安装插件,使用rake任务将任何rails数据库(包括mysql)转储到data.yml文件中,更改连接字符串以指向新数据库,然后最终将data.yml加载到任何新数据库(包括mysql)使用另一个rake任务。非常简单。

我非常担心需要到shell中寻找代码内部可以完成的事情。我不想引入不必要的依赖项。但是您提供的链接对于完全无关的事情非常有用。
> mysqldump -uroot -proot templateDB > dump.sql
> mysql -uroot -proot --execute="CREATE DATABASE newDB"
> mysql -uroot -proot newDB < dump.sql