我想要一个迁移来创建一个现有表的克隆,只需添加名称后缀,包括原始表中的所有索引。
所以有一个“快照”表,我想创建“snapshots_temp”作为表的精确副本(不是数据,只是表模式,但包括索引)。
我可以将该块复制并粘贴到schema.rb文件中并手动重命名。
但是,如果schema.rb中的定义仍然准确,那么在应用此迁移时我不确定。另一位开发人员可能已经更改了表,我不想更新我的迁移脚本。
那么我如何在运行时获取表的模式?从本质上讲,'rake schema:dump'如何对表进行反向工程,以便我可以在迁移中执行相同操作? (但更改表名称)。
答案 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)
将项目()
中的表条目直接复制到迁移中。只需更改表名称即可。