Migration in Rails ist ein Konzept zur Entwicklung, Abstraktion und Dokumentation von Datenbankstrukturen. Der übliche Weg zur Entwicklung bzw. Definition eines Datenbankschema in MySQL ist die Nutzung der DDL (Data Definition Language) wobei man üblicherweise Anweisungen wie diese in einer Datei speicherte:
CREATE TABLE `sample` (
`id` INT NOT NULL AUTO_INCREMENT ,
`caption` VARCHAR( 255 ) NOT NULL ,
`description` TEXT NOT NULL ,
`position` INT NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
Diese Dateien werden dann (ggfls. mit DROP TABLE IF EXISTS) über den MySQL Client oder auch PhpMyAdmin in die Datenbank eingespielt. Ich selber habe in meinem alten Framework diese Änderungen in jeweils eine Datei pro Änderung gepackt und in das Subversion Repository eingepflegt. So hatten alle beiteiligten Programmierer die Möglich stets den aktuellen Stand der Datenbank nachzuvollziehen. Migrationen in Rails gehen da noch einen Schritt weiter, es gibt wie üblich einen Generator dem man die Verwaltung und Erzeugung der Migrationen anvertraut.
script/generate migration AddedUserTable
Rails erzeugt nun im Verzeichnis /db/migrate/ eine Datei mit dem Namen 001_added_user_table.rb. Die Datei hat folgenden Inhalt:
class AddedUserTable < ActiveRecord::Migration def self.up end def self.down end end
Um nun dem Namen der Klasse gerecht zu werden bestücken wir die Methode mit Code der eine User Tabelle erzeugt.
class CreateUsers < ActiveRecord::Migration
def self.up
create_table "users", :force => true do |t|
t.column :login, :string
t.column :email, :string
t.column :crypted_password, :string, :limit => 40
t.column :salt, :string, :limit => 40
t.column :created_at, :datetime
t.column :updated_at, :datetime
t.column :remember_token, :string
t.column :remember_token_expires_at, :datetime
t.column :subscription_status, :string, {:default => "new"}
end
end
def self.down
drop_table "users"
end
end
Und sofort wird deutlich wie mächtig die Migrationen in Rails wirklich sind. Die Datenbankspezifischen DDL Anweisungen sind verschwunden und es gibt eine Syntax für alle Datenbanksysteme.