您如何通过Rails迁移克隆数据库表?

时间:2009-10-09 13:48:12

标签: ruby-on-rails migration schema dump

我想要一个迁移来创建一个现有表的克隆,只需添加名称后缀,包括原始表中的所有索引。

所以有一个“快照”表,我想创建“snapshots_temp”作为表的精确副本(不是数据,只是表模式,但包括索引)。

我可以将该块复制并粘贴到schema.rb文件中并手动重命名。

但是,如果schema.rb中的定义仍然准确,那么在应用此迁移时我不确定。另一位开发人员可能已经更改了表,我不想更新我的迁移脚本。

那么我如何在运行时获取表的模式?从本质上讲,'rake schema:dump'如何对表进行反向工程,以便我可以在迁移中执行相同操作? (但更改表名称)。

5 个答案:

答案 0 :(得分:24)

尝试使用纯SQL。这将做你想要的:

CREATE TABLE new_tbl LIKE orig_tbl;

答案 1 :(得分:5)

这样做。它并不完美,因为它不会复制表格选项或索引。如果您确实设置了任何表选项,则必须手动将它们添加到此迁移中。

要复制索引,您必须制定SQL查询以选择它们,然后将它们处理为新的add_index指令。这有点超出我的知识。但这适用于复制结构。

class CopyTableSchema < ActiveRecord::Migration
  def self.up
    create_table :new_models do |t|
      Model.columns.each do |column|
        next if column.name == "id"   # already created by create_table
        t.send(column.type.to_sym, column.name.to_sym,  :null => column.null, 
          :limit => column.limit, :default => column.default, :scale => column.scale,
          :precision => column.precision)
      end
    end

    # copy data 

    Model.all.each do |m|
      NewModel.create m.attributes
    end
  end

  def self.down
    drop_table :new_models
  end
end

答案 2 :(得分:5)

在Rails 4&amp; PostgreSQL,创建一个新的迁移并插入:

ActiveRecord::Base.connection.execute("CREATE TABLE clone_table_name AS SELECT * FROM source_table_name;")

这将创建具有原始表的确切结构的克隆,并使用旧值填充新表。

更多信息:http://www.postgresql.org/docs/9.0/static/sql-createtableas.html

答案 3 :(得分:0)

看起来这个逻辑被包含在ActiveRecord::SchemaDumper中,但它只暴露了一个一体化的“转储”方法,你不能只转储一个特定的表(the "table" method是私有的)

答案 4 :(得分:0)

将项目()中的表条目直接复制到迁移中。只需更改表名称即可。