【问题标题】:How can I copy a mySQL Database in ruby on rails?如何在 ruby​​ on rails 中复制 mySQL 数据库?
【发布时间】:2008-10-07 20:24:21
【问题描述】:

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

我们有一个模板数据库,其中包含我们需要复制的所有表和列。如何通过 ruby​​ on rails 以编程方式执行此操作?

【问题讨论】:

    标签: mysql ruby-on-rails ruby database


    【解决方案1】:

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

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

    Here 很好地描述了从 Ruby 调用命令行选项。

    【讨论】:

    • 我真的很担心需要进入 shell 来处理可以在代码内部完成的事情。我不想引入不必要的依赖。但是您提供的链接对于完全不相关的事情非常有用。
    【解决方案2】:

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

     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
    

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

    【讨论】:

      【解决方案3】:

      通过使用yaml_db

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

      【讨论】:

        【解决方案4】:

        您可以将模板架构创建代码放入包含所有必需的表/索引/视图/过程创建语句的脚本中,将其称为“template_schema.sql”或其他任何内容,然后在您的数据库上运行脚本选择(来自 Ruby,如果这就是你所追求的)然后你就完成了。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-30
          • 1970-01-01
          • 1970-01-01
          • 2018-05-24
          相关资源
          最近更新 更多