Как выполнить SQL команды в миграции Rails: руководство
Быстрый ответ
Для выполнения чистого SQL-кода в Rails миграции воспользуйтесь методом execute
:
class AddUsersTable < ActiveRecord::Migration[6\.0]
def change
execute 'CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(100));'
end
end
Обращу ваше внимание на:
- Метод
change
, который обеспечивает как применение, так и откат миграции — Rails понимает, как его отменить. - Если SQL-команда небольшая по размеру, вполне можно записать ее в одной строке.
Расширенные сценарии: использование чистого SQL
В миграциях SQL неограничено в возможностях: можно использовать не только метод execute
. Существуют различные подходы, выбор которых зависит от сложности задачи и специфических требований вашего проекта.
Переименование таблицы и трансформация данных
Если вы не просто переименовываете таблицу, но еще и преобразуете в ней данные, схема может выглядеть так:
class RenameAndTransformUsersTable < ActiveRecord::Migration[6\.0]
def up
execute <<-SQL
CREATE TABLE new_users AS
SELECT id, name, 'unknown' as email FROM users;
SQL
drop_table :users
rename_table :new_users, :users
end
def down
raise ActiveRecord::IrreversibleMigration
end
end
Изменения, легко откатываемые благодаря блоку reversible
Если вы используете Rails 4 или более новую версию, можете смело применять блоки reversible
для изящного и легко откатываемого внесения изменений.
class AddPartNumberToProducts < ActiveRecord::Migration[6\.0]
def change
reversible do |dir|
dir.up { execute 'ALTER TABLE products ADD COLUMN part_number STRING' }
dir.down { execute 'ALTER TABLE products DROP COLUMN part_number' }
end
end
end
Улучшение читаемости сложных SQL-команд с использованием here-docs
Сложные и многошаговые SQL-команды становятся более читаемыми благодаря применению here-docs:
class MultiStepSQL < ActiveRecord::Migration[6\.0]
def change
execute <<-SQL
DROP TABLE IF EXISTS old_users;
CREATE TABLE new_users (LIKE users INCLUDING ALL);
INSERT INTO new_users SELECT * FROM users;
SQL
end
end
Визуализация
При создании SQL-миграции в Rails советую следовать следующим шагам:
🛤️🚀 Пришло время миграции! 🚀🛤️
1. Определите действие: **create_table**, **add_column**
2. Компонуйте путь: используйте **execute 'SQL'**
3. Обеспечьте плавность процесса: учтите **проверки безопасности** и предусмотрите возможность отката.
При применении Rails Migrations вы предоставляете надежный способ управления миграцией данных в вашем приложении.
Освоение миграций: ключ к универсальности
Создание обратимых изменений
При использовании SQL для манипуляций со структурой базы данных важно формировать обратимые изменения:
class ChangeUsersTableName < ActiveRecord::Migration[6\.0]
def change
rename_table :users, :accounts
rescue
raise ActiveRecord::IrreversibleMigration
end
end
Баланс между безопасностью данных и структурными изменениями
Манипулируя структурой таблиц, приоритетным становится вопрос защиты данных:
class AddDefaultValue < ActiveRecord::Migration[6\.0]
def change
add_column :users, :active, :boolean, default: true
User.update_all(active: true) # запускаем заполнение данными
end
end
Полезные материалы
- Active Record Migrations — Ruby on Rails Guides — практическое руководство по использованию миграций в Rails.
- ActiveRecord::Migration – APIdock — ценный ресурс для получения информации о методах и общения с профессиональным сообществом.
- Newest 'rails-migrations' Questions – Stack Overflow — место, где можно найти ответы и обсудить вопросы, связанные с миграциями.
- ActiveRecord::Migration — официальная документация API по миграциям Rails.
- thoughtbot — советы по созданию эффективных миграций от известной IT-компании.
- GitHub – rubocop/rails-style-guide: Migrations — лучшие практики по поддержанию миграций в актуальном и работоспособном состоянии.