Managing SQL-based script can become a nightmare with time. Rails solved this with ActiveRecord Migration. Sam Livingston-Gray wrote a small standalone Ruby tool to generate hierarchical migration script. Based on the fact that SQL scripts can become very verbose and duplication-prone, Sam started SQrbL which is a mix of SQL and Ruby.
You'll be writing such script:
include Sqrbl
Sqrbl.migration do
@output_directory='/path/to/generated/sql'
group "Widgets" do
step "Create widgets" do
up do
helpers do
def widget_import_note
'"Imported from old_widgets"'
end
end
action "Migrate old_widgets" do
<<-SQL
#{
insert_into("new_widgets", {
:name => 'widget_name',
:part_num => 'CONCAT("X_", part_number)',
:note => widget_import_note,
})
}
FROM old_widgets
SQL
end
end
down do
action "Drop imported organizational contacts" do
'DELETE FROM new_widgets WHERE note LIKE "Imported from old_widgets"'
end
end
end
end
group 'Second Group' do
step 'Step one' do
up { write '-- Step one up' }
down { write '-- Step one down' }
end
step 'Step two' do
up { write '-- Step two up' }
down { write '-- Step two down'}
end
end
end
And SQrbL will produce the following files:
/path/to/generated/sql/up/1_widgets/1_create_widgets.sql /path/to/generated/sql/down/1_widgets/1_create_widgets.sql /path/to/generated/sql/up/2_second_group/1_step_one.sql /path/to/generated/sql/down/2_second_group/1_step_one.sql /path/to/generated/sql/up/2_second_group/2_step_two.sql /path/to/generated/sql/down/2_second_group/2_step_two.sql /path/to/generated/sql/all_up.sql /path/to/generated/sql/all_down.sql
For example all_up.sql is filled up with the SQL queries:
-- Migrate old_widgets
INSERT INTO new_widgets (
name,
part_num,
note
)
SELECT
widget_name AS name,
CONCAT("X_", part_number) AS part_num,
"Imported from old_widgets" AS note
FROM old_widgets
-- Step one up
-- Step two up
For the moment SQrbL only insert_into to simplify INSERT writing statements.
While the use of SQrbL might not look the best solution for people already using ActiveRecord Migration, it still might satisfy people looking for a quick simple standalone tool. For the moment SQrbL is in its 0.1.3 version and is lacking a proper SQL DSL.