Rails migrations in non-Rails (and non Ruby) projects.
Install Ruby, RubyGems and a ruby-database driver (e.g. gem install mysql
) then:
sudo gem install standalone_migrations
Add to Rakefile
in your projects base directory:
begin
require 'tasks/standalone_migrations'
MigratorTasks.new do |t|
# t.migrations = "db/migrations"
# t.config = "db/config.yml"
# t.schema = "db/schema.rb"
# t.sub_namespace = "dbname"
# t.env = "DB"
# t.verbose = true
# t.log_level = Logger::ERROR
end
rescue LoadError => e
puts "gem install standalone_migrations to get db:migrate:* tasks! (Error: #{e})"
end
Add database configuration to db/config.yml
in your projects base directory e.g.:
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
production:
adapter: mysql
encoding: utf8
reconnect: false
database: somedatabase_dev
pool: 5
username: root
password:
socket: /var/run/mysqld/mysqld.sock
test: &test
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
rake db:new_migration name=FooBarMigration
edit db/migrations/20081220234130_foo_bar_migration.rb
... and fill in the up and down migrations Cheatsheet.
If you're lazy and want to just execute raw SQL:
def self.up
execute "insert into foo values (123,'something');"
end
def self.down
execute "delete from foo where field='something';"
end
rake db:migrate
rake db:migrate VERSION=20081220234130
rake db:migrate DB=test
rake db:migrate:up VERSION=20081220234130
When working with multiple databases in a single application it is convenient to have separate sets of tasks for each database. This is accomplished with sub_namespace parameter - for example, given the following declaration:
MigratorTasks.new do |t|
t.migrations = "db/migrate/widgets"
t.sub_namespace = "widgets"
...
end
The following tasks will be created:
db:widgets:new_migration
db:widgets:migrate
...
And migrations for this database would be created in db/migrate/widgets subdirectory.
This work is based on Lincoln Stoll's blog post and David Welton's post.