2

Я помогаю с помощью рельсов для друга. У них есть база данных, которая содержит много таблиц, которые были добавлены вручную с использованием SQL, а не с рельсовыми миграциями. Они начали добавлять миграции нормально, но им нужно вернуть их обратно.Как исправить базу данных с множеством таблиц без соответствующих миграций с помощью Rails

Если мы добавим сейчас миграции, они будут ошибочными, поскольку эти таблицы/столбцы уже существуют. Если мы их оставим, люди должны использовать db: schema: load для запуска и запуска, а затем запускать миграцию по одному по имени, чтобы избежать ошибок. Мы бы хотели избежать этого и вернуться к здоровому состоянию.

Кто-нибудь знает, как лучше получить миграцию назад с помощью базы данных? Мы должны сделать это, не теряя никаких данных.

ответ

2

Вот question with the same problem (не голосовали за закрытие ваши как дубликат, так как старший не обслуживаемый ответ):

Решение есть:

  1. Start с помощью ссылки вашего существующая база данных MySQL в database.yml.
  2. запустить rake db:schema:dump для создания schema.rb файла
  3. Вставить create_table методы из вашего schema.rb в новую миграцию, и вуаля!

Чтобы избежать каких-либо несоответствий, вы всегда можете проверить, является ли таблица уже существует, и, если да, то просто пропустите миграцию в целом:

class CreateTable < ActiveRecord::Migration 
    def change 
    unless ActiveRecord::Base.connection.table_exists?('table_name') 
     create_table :table_names do |t| 
     # some columns 
     end 
    end 
    end 
end 
+0

Похоже, это потерпит неудачу в прод, потому что это было бы попытайтесь создать эти таблицы, и они уже существуют, нет? Я добавил предложение, чтобы уточнить, что мы должны делать это без потери данных. – williamcodes

+0

@william коды вы всегда можете использовать 'ActiveRecord :: Base.connection.table_exists? «table_name», чтобы проверить и не запустить миграцию –

+0

, что имеет смысл. Вы имеете в виду использовать его в качестве условного в файле миграции, чтобы он не запускался дважды, не так ли? Можете ли вы добавить это к своему ответу? – williamcodes

1

После резервного копирования содержимого таблиц, которые не присутствуют в миграции, вы можете:

  • DROP этих таблиц;
  • Создайте миграцию для каждой из упавших таблиц;
  • Запуск каждой из созданных миграций;
  • Вручную повторно заполняйте таблицы, созданные с помощью миграции.

Таким образом, у вас не будет проблем с миграциями. Если у вас нет соответствующих данных по ним, просто DROP их сразу.