четверг, 25 сентября 2008 г.

Детально о миграциях. Создание таблиц. Добавление полей.

Как уже было сказано в статье Миграции. Что такое миграции? после создания миграции, в ней присутствует всего два метода - self.up i self.down. Первый вызывается при выполнении текущей миграции в рамках проведения всех миграций (rake db:migrate), второй срабатывает когда делается откат текущей миграции.

Соответственно метод self.down нейтрализирует все то что было сделано методом self.up. Если мы в self.up добавляем новое поле то в self.down мы его должны удалить, если создаем таблицу - то при откате должны ее удалить, если переимнновываем или меняем тип поля, то при откате все должно вернутся на круги своя.

Тепер детально рассмотрим какие действия мы можем делать с БД в текущих методах. Сначала начнем с более простых действий, а закончим более сложными.

Условимся, что работать ми будем с таблицей пользователей, соответственно модель - User. Я буду попарно давать действия и противодействия (для отката).

Добавление нового поля

def self.up
add_column :users, :name, :string
end

Сначала указывается таблица, далее указывается имя поля, потом указывается его тип. Весь список используемых типов можно посмотреть в моей статье: Типы данных в миграциях для разных СУБД

Удаление нового поля

def self.down
remove_column :users, :name
end

Сначала указываем таблицу, потом имя поля которое нужно удалить

Переименование колонок

def self.up
rename_column :users, :name, :user_name
end

Указывается сначала таблицу, потом старое имя поля, потом новое имя поля

Обратное переименование колонок

def self.down
rename_column :users, :user_name, :name
end

для отката достаточно вызвать то же метод, только поменять поля местами

Изменение типа поля

def self.up
change_column :users, :age, :integer
end

Указывается сначала имя таблицы, потом имя поля, потом его новый тип

Обратное изменение имя поля

def self.down
change_column :users, :age, :string
end

Для обратного изменения достаточно указать старый тип. Но иногда бывает так, что нада заблокировать возможность отката, например если у нас логика приложения будет жестко привязана к тому что тип поля целый. Тогда в Рельсах используется специальная конструкция которая запрещает откат даной миграции:

def self.down
raise ActiveRcord::IrreversibleMigration
end

Следующим большим разделом будут - Таблицы

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

def self.up
create_table :users, * do |table|
table.column :name, :string, **
table.column :age, :integer
end
end

* - здесь могут указыватся дополнительные опции для создания таблицы:

:force=>true/false - удалать таблицу если уже существует таблица с таким именем
:temporary=>true/false - промежуточная таблица(существует до дисконекта с базой)
:option=>"same opions", например: "auto_increment = 25" - дополнительные SQL опции
:primary_key=>:field_name - если нада задать имя поля отличное от дефолтного ID
:id=>false - если нужно создать таблицу без первичного ключа

** - здесь и в конце каждого объявления поля могут быть дополнительные опции:

:null => true/false - признак того, может ли поле быть null
:limit => field size - максимальный размер поля
:default => default value - значение поля по-умолчанию
В table.column указывается имя поля, тип поля

Удаление таблицы

def self.down
drop_table :users
end
Тут я думаю все понятно :)

Создание/удаление индексов

add_index :users, :name - Для создания индекса указываем таблицу и имя поля

remove_index :user, :name - Для удаление индекса указываем таблицу и имя поля

1 комментарий:

  1. Привет, очень помогла твоя статья, информацию по данной теме, если не владеешь англ., найти трудно. Но есть маленькие замечания:
    например в строке "remove_index :users, :name", :users - это не наименование модели, как вы пишите, а наименование таблицы, которое по умолчанию отличается от наименования модели (класса модели) множественной формой. Спасибо.

    ОтветитьУдалить