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)
这样做.它并不完美,因为它不会复制表格选项或索引.如果您确实设置了任何表选项,则必须手动将它们添加到此迁移中.
要复制索引,您必须制定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)
在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
归档时间: |
|
查看次数: |
9663 次 |
最近记录: |