我有一个脚本文件夹,我想对我的数据库运行SQL脚本。有没有办法可以遍历所有SQL文件,并通过检查数据库中的表来检查SQL文件是否未执行。
检查脚本是否已执行,如果没有则执行,否则只是跳过它。 在运行SQL脚本之后,它应该在表中插入一个条目,只是为了跟踪脚本的执行情况。
我正在考虑编写一个ruby或python脚本来实现这一目标。有什么想法吗?
答案 0 :(得分:0)
在答案开始之前: 您的问题看起来像是迁移,例如migrations from Sequel或Active Record
。{{3}}或{{3}}在您尝试回答之前,请先查看此迁移。
使用续集你可以尝试这样的事情:
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')
如果您第二次调用它,则会看到脚本未再次调用。