`
fsword
  • 浏览: 170683 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

改进一下昨天的工具,不再使用中间文件

 
阅读更多

[PS: javaeye上的评论好像不能提交,只好另写一篇了]

 

昨天写的小工具需要把database.yml改来改去的,不能自动化,今天上午搞了一把,直接建立两个数据库连接,然后数据库对数据库copy

使用时将旧的数据库配置文件复制为 old_database.yml ,配置好新的 database.yml 就可以提交代码了,服务器上更新一下,然后运行 rake data:copy 就ok了

 

 

namespace :data do
  desc "copy data from old database"
  task :copy => 'db:migrate' do
    config = YAML::load(ERB.new(IO.read('config/old_database.yml')).result)
    $spec = config[Rails.env].inject({}) do |hash, value|
      hash.update value[0].to_sym => value[1]
    end
    (ActiveRecord::Base.connection.tables - ["schema_migrations"]).each {|t|
      Rails.logger.info "copy #{t}"
      new_clazz, old_clazz = prepare_class t
      old_clazz.all.each{|o|
        new_o = new_clazz.new(o.attributes)
        new_o.id = o.id
        new_o.save!
      }
    }
  end

  private
    def prepare_class table_name
      class_name = table_name.camelize.singularize
      eval %Q[
        class #{class_name}Old < ActiveRecord::Base
          establish_connection $spec
          set_table_name '#{table_name}'
        end
      ]
      Object.send :remove_const, class_name rescue nil
      eval("class #{class_name} < ActiveRecord::Base; end")
      [class_name.constantize, "#{class_name}Old".constantize]
    end
end
 
0
0
分享到:
评论
1 楼 fsword 2011-09-02  
再补充一个mongodb的
  desc "copy data from old database to mongodb"
  task :mongoid => 'db:migrate' do
    config = YAML::load(ERB.new(IO.read('config/old_database.yml')).result)
    $spec = config[Rails.env].inject({}) do |hash, value|
      hash.update value[0].to_sym => value[1]
    end
    (ActiveRecord::Base.connection.tables - ["schema_migrations"]).each {|table_name|
      Rails.logger.info "copy #{table_name}"

      class_name = table_name.camelize.singularize
      eval %Q[
        class #{class_name}Old < ActiveRecord::Base
          establish_connection $spec
          set_table_name '#{table_name}'
        end
      ]
      Object.send :remove_const, class_name rescue nil
      eval %Q[
        class #{class_name}
          include Mongoid::Document
          store_in :#{table_name}
        end
      ]
      new_clazz, old_clazz = [class_name.constantize, "#{class_name}Old".constantize]

      old_clazz.all.each{|o|
        attr_hash = o.attributes.inject({}) do |hash,v| hash.update v[0] => ((v[1].is_a? Time) ? v[1].utc : v[1]) end
        new_o = new_clazz.new(attr_hash)
        new_o.save!
      }
    }
  end

相关推荐

    Windows内部原理(十一):存储和文件系统

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

    WINDOWS 内部原理(十)驱动和硬件的管理

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

    windows 内部原理(一)

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

    WINDOWS 内部原理 (八)

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

    WINDOWS 内部原理(九)

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

    WINDOWS 内部原理 (三)

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

    WINDOWS 内部原理(四)

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

    WINDOWS 内部原理(五)

    在全面了解了Windows的体系结构和程序运行方式后,我们将进一步介绍访问越界、缓冲溢出、内存泄露等故障的原理,并理论联系实际,带领大家使用调试工具来解决一些常见的问题。 深入研究Windows内部原理系列之十五...

Global site tag (gtag.js) - Google Analytics