Как вы можете клонировать таблицу базы данных с помощью миграции на Rails? - PullRequest
13 голосов
/ 09 октября 2009

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

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

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

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

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

Ответы [ 5 ]

24 голосов
/ 12 октября 2009

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

CREATE TABLE new_tbl LIKE orig_tbl;
5 голосов
/ 10 мая 2014

В 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 голосов
/ 12 октября 2009

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

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

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

0 голосов
/ 11 октября 2009

Похоже, что эта логика заключена в ActiveRecord :: SchemaDumper , но она предоставляет только метод "дамп" "все в одном", и вы не можете создать дамп только конкретной таблицы ( метод "table" является приватным).

...