Подтвердить что ты не робот

Как можно клонировать таблицу базы данных с помощью миграции Rails?

Мне нужна миграция для создания клона существующей таблицы, просто суффиксом имени, включая все индексы из исходной таблицы.

Итак, есть таблица "моментальных снимков", и я хочу создать "snapshots_temp" как точную копию таблицы (а не данные, только схему таблицы, но включая индексы).

Я мог бы просто скопировать и вставить блок из файла schema.rb и вручную переименовать его.

Но я не уверен, к моменту применения этой миграции, если определение из schema.rb будет по-прежнему точным. Другой разработчик, возможно, изменил таблицу, и мне не нужно обновлять мою миграцию script.

Итак, как я могу получить схему таблицы во время выполнения? По сути, как "rake schema: dump" реконструирует таблицу, чтобы я мог сделать то же самое в моей миграции? (но изменение имени таблицы).

4b9b3361

Ответ 1

Попробуйте сделать это с помощью чистого SQL. Это сделает то, что вы хотите:

CREATE TABLE new_tbl LIKE orig_tbl;

Ответ 2

Это будет сделано. Это не идеально, потому что он не будет копировать параметры таблицы или индексы. Если у вас есть какие-либо параметры таблицы, вам придется вручную добавить их в эту миграцию.

Чтобы скопировать индексы, вам нужно будет сформулировать 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

Ответ 3

В 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

Ответ 5

Скопируйте запись таблиц из ваших проектов db/schema.rb прямо в вашу миграцию. Просто измените имя таблицы и ваше хорошее, чтобы идти.