当前位置: 首页 > 知识库问答 >
问题:

数据库之间的Rake任务复制

寿鸣
2023-03-14

我有一个带有Mongoid数据库的Rails 4应用程序,并想引入一个沙盒环境进行测试。有一些数据(两个模型),我想从生产数据库复制到沙盒。

我会用一个rake任务来完成这个任务,这个任务被cronjob调用。然而,在这个rake任务中,我不确定如何建立到数据库的两个连接,并对不同的数据库使用相同的模型。

我也在考虑在mongodb层做这件事(就像他们在这里做的那样,如何在mongodb中将一个集合从一个数据库复制到另一个数据库),但一个模型由数据组成,只应部分复制到沙盒数据库。因此,我认为我必须在Rails环境中进行。

在这个rake任务中,我可以查看我的所有文章,但我不知道如何将它们“推”到沙盒数据库中:

namespace :sandbox do
  desc "Syncs production -> sandbox data"
    task(:sync => :environment) do |t, args|
      Article.all.each do |article|
        if my_model1.state == :active
          # here it should sync article to the sandbox models

          # and then, it should also sync all the comments to the sandbox models
          article.comments
        end
      end
    end
  end
end

共有1个答案

孔宇
2023-03-14

我终于自己找到了解决办法。关键是可以在mongoid中定义的mongoid会话。yml。

如果您想将生产数据复制到沙盒,您可以在沙盒环境中定义第二个会话(您在沙盒环境中启动任务,它允许您访问生产数据库):

sandbox:
  sessions:
    default:
      database: your_sandbox_db
      hosts:
        - localhost:27017
    production_sync:
      database: your_production_db
      hosts:
        - localhost:27017

您可以通过为要同步的模型定义一个单独的类来访问production_sync会话,如下所示:

class ArticleProduction
  include Mongoid::Document
  include Mongoid::Attributes::Dynamic
  store_in collection: "articles", session: "production_sync"
end

现在可以使用此类访问生产数据库。如果要将所有数据从生产复制到沙盒,请按以下方式执行

production_articles = ArticleProduction.map(&:attributes)
production_articles.each do |attributes|
  Article.create(attributes)
end

我给自己定义了一个rake任务,每天由cronjob调用,并将数据从生产同步到沙箱。

还有一个问题:如果您想确保不更改任何数据,某种只读模式将非常有用(请参阅此处使mongoid会话为只读)。

 类似资料:
  • 嗨,我有一个充满产品的数据库,我需要安排一个rake任务运行每周。我不太确定如何编写rake任务。例如,我有一个id=1name=“testname”description=“description”sku=“198”price=12.99的产品,我需要上传一个带有name=“testname”的csv,并将价格更新为13.99,同时保持id不变。这是我尝试到目前为止,但它不是完整的,如果有人能帮

  • JavaFX 8任务和服务之间有什么区别,在哪种情况下使用一个比另一个更好?数据库操作用什么比较好?

  • 事务如何在带有Spring DSL的骆驼路由中工作,并且其中一条路由抛出异常? 如果routeB抛出异常,将如何将异常传播回RouteA。 如果在routeB中抛出异常,我可以看到正在处理异常并回滚事务。 我的骆驼路由定义:

  • 我正在寻找一种最有效和最快的方式来将大量的数据从位于欧洲的SQL Server传输到位于美国的SQL Server。 传统的方法需要更长的时间。 null 有谁能提出解决这个问题的最佳方法吗?

  • resume-task 命令用于恢复处于 Paused 状态的数据迁移任务,通常用于在人为处理完造成迁移任务暂停的故障后手动恢复迁移任务。 help resume-task resume a specified paused task Usage: dmctl resume-task [-s source ...] <task-name | task-file> [flags] Flags:

  • 本文向大家介绍数据仓库和运营数据库之间的区别,包括了数据仓库和运营数据库之间的区别的使用技巧和注意事项,需要的朋友参考一下 数据仓库是用于结构化,经过过滤的数据的存储库,该数据已针对特定目的进行了处理。数据软件从多个来源收集数据,并使用ETL流程转换数据,然后将其加载到数据仓库中以用于业务目的。 运营数据库是那些数据经常更改的数据库。它们主要设计用于大量数据交易。它们是数据仓库的源数据库,用于维护