通过 SQrbL 简化 SQL 迁移脚本

  • 2009-08-29
  • 本文字数:1177 字

    阅读完需:约 4 分钟

随着时间的推移,管理基于 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。

查看英文原文: Simplify SQL Migration Scripts with SQrbL