2015-05-04 127 views
1

我有一個腳本文件夾,我想對我的數據庫運行SQL腳本。有沒有一種方法可以迭代所有SQL文件,並通過檢查數據庫中的表來檢查SQL文件是否未執行。在文件夾中運行SQL腳本

檢查腳本是否被執行,如果沒有,那麼它執行別的只是跳過它。 運行SQL腳本後,它應該在表中插入一個條目,以便跟蹤腳本的執行情況。

我想寫一個紅寶石或python腳本來實現這一點。有什麼想法嗎 ?

+0

你已經知道遷移的概念了嗎?例如。與[續集](http://sequel.jeremyevans.net/rdoc/files/doc/migration_rdoc.html)。背景:遷移按照您的要求進行,只有一個限制:以嚴格的順序執行,實際的遷移步驟存儲在表中。 – knut

回答

0

答案開始之前: 您的問題看起來像一個遷移,例如, migrations from SequelActive Record

在嘗試我的答案之前,請首先查找此遷移。


有了續集,你可以嘗試這樣的事:

def call_sql_scripts(mask) 
    DB.create_table(:executed){ 
    add_column :filename 
    } unless DB.table_exists?(:executed) 

    Dir[mask].each{|filename| 
    if DB[:executed].filter(:filename => filename).first 
     puts "Script %s was already executed" % filename 
    else 
     puts "Start %s" % filename 
     begin 
     DB.run(File.read(filename)) 
     DB[:executed].insert(:filename => filename) #executed if run was successful 
     rescue Sequel::DatabaseError 
     puts "%s failed" % filename 
     end 
    end 

    } 
end 

call_sql_scripts('*.sql') 

:executed存儲已經執行的腳本文件。

注意:

  • 如果重命名或移動文件,這些文件被檢測爲不改變。
  • 沒有定義的序列(如果你需要這個,你必須看一看的遷移。)
  • 我寧願用續集的命令建立數據庫,而不是在文件中加載的SQL腳本。

一個完整的最小工作示例:

File.open('1.sql', 'w'){|f| f << 'create table tab1 (`field` add_column)'} 
File.open('2.sql', 'w'){|f| f << 'create table tab2 (`field` add_column)'} 
File.open('3.sql', 'w'){|f| f << 'create table tab3 (`field` add_column)'} 

require 'sequel' 
DB = Sequel.sqlite('test2.db') 

def call_sql_scripts(mask) 
    DB.create_table(:executed){ 
    add_column :filename 
    } unless DB.table_exists?(:executed) 

    Dir[mask].each{|filename| 
    if DB[:executed].filter(:filename => filename).first 
     puts "Script %s was already executed" % filename 
    else 
     puts "Start %s" % filename 
     begin 
     DB.run(File.read(filename)) 
     DB[:executed].insert(:filename => filename) #executed if run was successful 
     rescue Sequel::DatabaseError 
     puts "%s failed" % filename 
     end 
    end 

    } 
end 

call_sql_scripts('*.sql') 

如果你叫什麼你看到腳本不再稱爲第二次。