2009-10-09 22 views
12

我想要一個遷移來創建一個現有表的克隆,只需將名稱加上後綴,包括原始表中的所有索引。如何通過Rails遷移來克隆數據庫表?

所以有一個「快照」表,我想創建「snapshots_temp」作爲表的精確副本(不是數據,只是表模式,但包括索引)。

我可以從schema.rb文件中複製粘貼該塊並手動重命名它。

但是,如果schema.rb中的定義仍然準確,我不確定在應用此遷移時。另一位開發人員可能已經更改了表格,我不想更新我的遷移腳本。

那麼我怎樣才能在運行時得到表的架構?從本質上講,'rake schema:dump'如何對錶進行逆向工程,以便我可以在遷移過程中執行相同的操作? (但改變表名)。

回答

21

試着用純SQL做。這將做你想要什麼:

CREATE TABLE new_tbl LIKE orig_tbl; 
+0

良好的通話。 「使用LIKE根據另一個表的定義創建一個空表,包括原始表中定義的任何列屬性和索引」http://dev.mysql.com/doc/refman/5.1/en/create-table「。 html –

+0

適用於MySQL(也可能是大多數數據庫),但如果使用Sqlite,則無法工作。我在開發環境中遇到了這個問題。生產很好(它是MySQL)。 – MiniQuark

+1

非常感謝。請注意,您複製的表將獲取索引,但不包含任何外鍵。你將不得不分別重新創建它們。 –

4

這樣做。這並不完美,因爲它不會複製表格選項或索引。如果您確實設置了任何表格選項,則必須手動將它們添加到此遷移中。

要複製索引,您必須制定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 
+0

>它不會複製表格選項或索引 謝謝但索引是一個要求。 –

4

在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

+1

小心這一點,因爲它也會複製ID列,並且不會將它設置爲新表中的主要部分。 –

0

複製表條目從項目db/schema.rb直接進入你的遷移。只要改變表名和你的好去。