1
我有一個腳本文件夾,我想對我的數據庫運行SQL腳本。有沒有一種方法可以迭代所有SQL文件,並通過檢查數據庫中的表來檢查SQL文件是否未執行。在文件夾中運行SQL腳本
檢查腳本是否被執行,如果沒有,那麼它執行別的只是跳過它。 運行SQL腳本後,它應該在表中插入一個條目,以便跟蹤腳本的執行情況。
我想寫一個紅寶石或python腳本來實現這一點。有什麼想法嗎 ?
我有一個腳本文件夾,我想對我的數據庫運行SQL腳本。有沒有一種方法可以迭代所有SQL文件,並通過檢查數據庫中的表來檢查SQL文件是否未執行。在文件夾中運行SQL腳本
檢查腳本是否被執行,如果沒有,那麼它執行別的只是跳過它。 運行SQL腳本後,它應該在表中插入一個條目,以便跟蹤腳本的執行情況。
我想寫一個紅寶石或python腳本來實現這一點。有什麼想法嗎 ?
答案開始之前: 您的問題看起來像一個遷移,例如, migrations from Sequel或Active 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
存儲已經執行的腳本文件。
注意:
一個完整的最小工作示例:
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')
如果你叫什麼你看到腳本不再稱爲第二次。
你已經知道遷移的概念了嗎?例如。與[續集](http://sequel.jeremyevans.net/rdoc/files/doc/migration_rdoc.html)。背景:遷移按照您的要求進行,只有一個限制:以嚴格的順序執行,實際的遷移步驟存儲在表中。 – knut