Что такое миграции?ruby-45

Миграции — это система контроля версий для базы данных, позволяющая изменять схему БД последовательно и согласованно.

Основные концепции миграций

1. Что такое миграция?

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

  • Создание/удаление таблиц
  • Добавление/удаление столбцов
  • Изменение типов данных
  • Создание индексов и ограничений

2. Преимущества миграций

  • Версионный контроль для структуры БД
  • Совместная работа в команде
  • Откат изменений при необходимости
  • Независимость от конкретной СУБД

Создание миграций

1. Генерация миграции

rails generate migration AddTitleToArticles title:string

Создает файл в db/migrate/YYYYMMDDHHMMSS_add_title_to_articles.rb

2. Структура файла миграции

class AddTitleToArticles < ActiveRecord::Migration[7.0]
  def change
    add_column :articles, :title, :string
  end
end

Основные операции в миграциях

1. Создание таблицы

create_table :articles do |t|
  t.string :title
  t.text :body
  t.timestamps  # Добавляет created_at и updated_at
end

2. Изменение таблицы

add_column :articles, :author, :string
remove_column :articles, :old_column
rename_column :articles, :old_name, :new_name
change_column :articles, :views, :integer, default: 0

3. Индексы и ограничения

add_index :articles, :title
add_foreign_key :articles, :users
remove_index :articles, :title

4. Выполнение SQL напрямую

execute "ALTER TABLE articles ADD COLUMN status VARCHAR(30)"

Работа с миграциями

1. Запуск миграций

rails db:migrate

Выполняет все невыполненные миграции

2. Откат миграции

rails db:rollback

Откатывает последнюю миграцию

3. Просмотр статуса

rails db:migrate:status

4. Сброс базы данных

rails db:reset

Удаляет базу, создает заново и заполняет seeds

Продвинутые техники

1. Условные миграции

add_column :articles, :featured, :boolean unless column_exists?(:articles, :featured)

2. Обработка ошибок

def change
  safety_assured { remove_column :articles, :old_column }
end

3. Изменение данных в миграциях

class AddDefaultStatus < ActiveRecord::Migration[7.0]
  def up
    add_column :articles, :status, :string, default: 'draft'
    Article.update_all(status: 'published')
  end

  def down
    remove_column :articles, :status
  end
end

Лучшие практики

  1. Не изменяйте существующие миграции - создавайте новые
  2. Используйте reversible-операции там, где возможно
  3. Избегайте изменения данных в миграциях (лучше использовать seeds или отдельные задачи)
  4. Добавляйте индексы для часто используемых столбцов
  5. Тестируйте миграции перед деплоем в production

Файл schema.rb

После выполнения миграций Rails обновляет db/schema.rb - текущее состояние схемы БД.

Важно: Не редактируйте этот файл вручную!

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