随着时间的推移,管理基于 SQL 的脚本简直成了梦魇。Rails 则通过 ActiveRecord Migration 解决了这个问题。 Sam Livingston-Gray 编写了一个独立的 Ruby 小工具,来生成层次化的迁移脚本。因为 SQL 脚本通常都比较繁复冗赘,因此 Sam 将 SQL 和 Ruby 相结合创建了 SQrbL 。
你可以这样来编写脚本:
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
于是 SQrbL 会生成如下文件:
/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
例如 all_up.sql 中的 SQL 语句便是:
-- 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
目前,SQrbL 还仅能通过 insert_into 来简化 INSERT 语句。
尽管对于已经使用 ActiveRecord Migration 的开发者来说,并没有什么理由再去使用 SQrbL,然而它依然适合于那些寻找快速且简单的独立工具的人们。当前 SQrbL 的版本是 0.1.3,尚缺乏一套适合的 SQL DSL。




