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

Tef*_*Ted 15 migration schema dump ruby-on-rails

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

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

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

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

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

zen*_*azn 26

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

CREATE TABLE new_tbl LIKE orig_tbl;
Run Code Online (Sandbox Code Playgroud)

  • 对于那些关于PostgreSQL的人:`CREATE TABLE new_tbl(LIKE orig_tbl包括包含索引的默认值);`或`包含所有'[克隆所有内容](http://www.postgresql.org/docs/9.3/static/sql-createtable. HTML) (11认同)

EmF*_*mFi 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
Run Code Online (Sandbox Code Playgroud)


hta*_*irt 5

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

ActiveRecord::Base.connection.execute("CREATE TABLE clone_table_name AS SELECT * FROM source_table_name;")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 小心这一点,因为它也会复制ID列,并且不会在新表中将其设置为主列. (4认同)