通过 SQrbL 简化 SQL 迁移脚本

  • Sebastien Auvray
  • 李明(nasi)

2009 年 8 月 29 日

话题:RubyDevOps语言 & 开发架构

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

RubyDevOps语言 & 开发架构