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

18

我希望进行一次迁移,只需为现有表添加后缀,即可创建其副本,并包括原始表中的所有索引。

假设有一个"快照"表,我想要创建 "快照_temp " 作为该表的精确副本(只包含表结构,但包括索引)。

我可以从schema.rb文件中复制块并手动重命名。但是,我不确定在应用此迁移时,schema.rb文件中的定义是否仍然准确。 另一个开发人员可能会更改表,我不想更新我的迁移脚本。

那么,如何在运行时获取表的架构?实质上,'rake schema:dump' 如何反向工程化表格,以便我可以在我的迁移中执行相同操作(但更改表名称)?

5个回答

33

尝试使用纯SQL来完成。这将实现你所需的功能:

CREATE TABLE new_tbl LIKE orig_tbl;

不错的选择。 "使用LIKE根据另一个表的定义创建一个空表,包括在原始表中定义的任何列属性和索引" http://dev.mysql.com/doc/refman/5.1/en/create-table.html - Teflon Ted
可以与MySQL(以及可能大多数数据库)一起使用,但如果您使用Sqlite,则无法正常工作。我在开发环境中遇到了这个问题。生产环境没问题(它是MySQL)。 - MiniQuark
1
太棒了,谢谢。请注意,你复制的表会保留索引,但不包括任何外键。你需要单独重新创建它们。 - Rich Sutton
12
针对使用PostgreSQL的用户:可以使用以下语句进行克隆表操作:CREATE TABLE new_tbl (LIKE orig_tbl INCLUDING DEFAULTS INCLUDING INDEXES);或者INCLUDING ALL(包括所有内容)。更多详情,请参考PostgreSQL文档 - Rescribet
这里有另一篇帖子中的有用答案,介绍了克隆和复制所有数据到另一个表的两个命令:https://dev59.com/wnA75IYBdhLWcg3weY1f#3280042 - Excalibur
显示剩余2条评论

7
在Rails 4 和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

4
小心使用此方法,因为它会复制 ID 列,并且不会将其设置为新表的主键。 - Guillermo Siliceo Trueba
它不会重新创建索引。 - Thomas Andrews

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

它不会复制表选项或索引。谢谢,但索引是必需的。 - Teflon Ted
我想要一个不需要索引就能克隆的东西。 - Subham Padhi

2

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接