在文件夹

时间:2015-05-04 17:49:39

标签: python ruby sql-server rake sqlcmd

我有一个脚本文件夹,我想对我的数据库运行SQL脚本。有没有办法可以遍历所有SQL文件,并通过检查数据库中的表来检查SQL文件是否未执行。

检查脚本是否已执行,如果没有则执行,否则只是跳过它。 在运行SQL脚本之后,它应该在表中插入一个条目,只是为了跟踪脚本的执行情况。

我正在考虑编写一个ruby或python脚本来实现这一目标。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在答案开始之前: 您的问题看起来像是迁移,例如migrations from SequelActive 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存储已执行的脚本文件。

注意:

  • 如果您重命名或移动文件,则不会将其检测为更改。
  • 没有明确的顺序(如果您需要,必须查看迁移。)
  • 我更愿意使用Sequel-commands来构建数据库,而不是在Files中加载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')

如果您第二次调用它,则会看到脚本未再次调用。