Ruby on rails 如何通过Rails迁移克隆数据库表?

Ruby on rails 如何通过Rails迁移克隆数据库表?,ruby-on-rails,migration,schema,dump,Ruby On Rails,Migration,Schema,Dump,我希望通过一次迁移来创建一个现有表的克隆,只需在名称后面加上后缀,包括来自原始表的所有索引 这里有一个快照表,我想创建快照作为表的精确副本,不是数据,只是表模式,而是包括索引 我可以复制并粘贴schema.rb文件中的块,然后手动重命名它 但我不确定在应用此迁移时,schema.rb中的定义是否仍然准确。其他开发人员可能已经更改了表,我不想更新迁移脚本 那么,如何在运行时获取表的模式呢?从本质上说,“rakeschema:dump”如何对表进行反向工程,以便在迁移过程中也能这样做?但是更改表名。

我希望通过一次迁移来创建一个现有表的克隆,只需在名称后面加上后缀,包括来自原始表的所有索引

这里有一个快照表,我想创建快照作为表的精确副本,不是数据,只是表模式,而是包括索引

我可以复制并粘贴schema.rb文件中的块,然后手动重命名它

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


那么,如何在运行时获取表的模式呢?从本质上说,“rakeschema:dump”如何对表进行反向工程,以便在迁移过程中也能这样做?但是更改表名。

看起来这个逻辑已经包含在中,但它只公开了一个多功能转储方法,并且不能只转储一个特定的私有表。

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

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

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

试着用纯SQL来做。这将满足您的要求:

CREATE TABLE new_tbl LIKE orig_tbl;

在Rails 4和PostgreSQL中,创建新迁移并插入:

ActiveRecord::Base.connection.execute("CREATE TABLE clone_table_name AS SELECT * FROM source_table_name;")
这将使用原始表的精确结构创建克隆,并使用旧值填充新表


更多信息:

将项目db/schema.rb中的表条目直接复制到迁移中。只需更改表名和您的good to go即可。

>它不会复制表选项或索引,谢谢,但索引是一项要求。Lol我想要的是不使用indexGood call进行克隆的内容。使用LIKE根据另一个表的定义创建一个空表,包括原始表中定义的任何列属性和索引都适用于MySQL,可能适用于大多数数据库,但如果使用Sqlite,则无法使用。我在开发环境中遇到了这个问题。制作很好,这是MySQL。太棒了,谢谢。请注意,复制的表将获得索引,但不会获得任何外键。您必须单独重新创建这些表。对于PostgreSQL上的表:创建表new\u tbl,如orig\u tbl,包括包括索引在内的默认值;或者在另一篇文章中包含所有这两个用于克隆所有数据并将其复制到另一个表中的命令有一个有用的答案:注意这一点,因为它也会复制ID列,并且不会在新表中将其设置为主索引,也不会重新创建索引。