赞助商
随着时间的推移,管理基于SQL的脚本简直成了梦魇。Rails则通过ActiveRecord Migration解决了这个问题。Sam Livingston-Gray编写了一个独立的Ruby小工具,来生成层次化的迁移脚本。因为SQL脚本通常都比较繁复冗赘,因此Sam将SQL和Ruby相结合创建了SQrbL

你可以这样来编写脚本:
  1. include Sqrbl

  2. Sqrbl.migration do
  3.     @output_directory='/path/to/generated/sql'

  4.     group "Widgets" do
  5.       step "Create widgets" do
  6.         up do
  7.      
  8.           helpers do
  9.             def widget_import_note
  10.                 '"Imported from old_widgets"'
  11.             end
  12.           end
  13.      
  14.           action "Migrate old_widgets" do
  15.             <<-SQL
  16.               #{
  17.                 insert_into("new_widgets", {
  18.                   :name    => 'widget_name',
  19.                   :part_num => 'CONCAT("X_", part_number)',
  20.                   :note    => widget_import_note,
  21.                 })
  22.               }
  23.               FROM old_widgets
  24.             SQL
  25.           end
  26.         end

  27.         down do
  28.           action "Drop imported organizational contacts" do
  29.             'DELETE FROM new_widgets WHERE note LIKE "Imported from old_widgets"'
  30.           end
  31.         end
  32.       end
  33.     end 
  34.  
  35.     group 'Second Group' do
  36.       step 'Step one' do
  37.         up { write '-- Step one up' }
  38.         down { write '-- Step one down' }
  39.       end
  40.       step 'Step two' do
  41.         up { write '-- Step two up' }
  42.         down { write '-- Step two down'}
  43.       end
  44.     end     
  45.      
  46. 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语句便是:
  1. -- Migrate old_widgets

  2. INSERT INTO new_widgets (
  3.     name,
  4.     part_num,
  5.     note
  6. )
  7. SELECT
  8.     widget_name AS name,
  9.     CONCAT("X_", part_number) AS part_num,
  10.     "Imported from old_widgets" AS note
  11. FROM old_widgets

  12. -- Step one up

  13. -- Step two up
复制代码
目前,SQrbL还仅能通过insert_into来简化INSERT语句。

尽管对于已经使用ActiveRecord Migration的开发者来说,并没有什么理由再去使用SQrbL,然而它依然适合于那些寻找快速且简单的独立工具的人们。当前SQrbL的版本是0.1.3,尚缺乏一套适合的SQL DSL。




作者 Sebastien Auvray  译者 李明(nasi)
赞助商
赞助商
TOP