对于Ruby on Rails Heroku应用程序,如何将相关用户信息(不是全部)从一个生产数据库复制到另一个生产数据库

我在Heroku上有两个应用程序。 一个是生产应用程序,另一个是临时应用程序。 我在登台服务器上有一个新数据库。 我需要复制相关的用户信息,这些信息包含在某些表中。 我知道pgbackups插件,但它复制整个数据库。 我不想复制整个数据库,因为它太大了,而且大多数数据都无关紧要。

我只想要一小部分,与用户帐户有关。 有没有办法将生产数据库中的相关行复制到登台数据库? 我可以编写Ruby on Rails查询来获取信息,但似乎无法将其保存到另一个数据库。 我需要采取哪些步骤来复制用户数据,还是有一些解决方法可以做同样的事情?

您可以使用要导出的数据从生产应用程序向登台应用程序发送特定请求,并将其存储在登台数据库中。

我一直在使用YamlDb来保存我的数据库的状态。

使用以下命令安装它:

script/plugin install git://github.com/adamwiggins/yaml_db.git 

使用rake任务将Rails数据库的内容转储到db / data.yml

 rake db:data:dump 

使用rake任务将db / data.yml的内容加载到数据库中

 rake db:data:load 

这是创作者的主页:

http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/

我最近用我想传输的数据写出了json,并在另一端导入了它。

有些人喜欢:

 File.open("users.json", "wb") do |f| f << User.where(condition: true).to_json end 

在另一个数据库:

 users_json = JSON.parse(File.read("users.json")) users_json.each do |json| User.create json end 

如果您需要在数据库之间复制某些数据部分,Postgres扩展dblink可能是一个不错的选择。 您可以连接到目标数据库并运行类似的操作(注意:您可能需要阅读一些文档来确定连接语法):

 CREATE EXTENSION dblink; INSERT INTO table SELECT * FROM dblink('...', 'select name from table') AS remote(name text); 

我最近发布了一个名为forceps的库,您可以使用它从不同的数据库导入活动记录模型。

您需要做的第一件事是为生产数据库配置Active Record连接。 Heroku允许您使用以下命令获取Postgres数据库凭据:

 heroku pg:credentials  --app  

使用这些凭据,您可以在database.yml文件中配置名为remote的节点。

 remote: adapter: postgresql host: ... port: 5432 username: ... password: ... database: ... encoding: utf8 

现在,您可以准备一个脚本,将生产中的东西复制到您正在使用的默认环境中。 您可以在开发中测试此脚本,然后在分段上运行它。

例如,如果要复制所有帐户,则该脚本可能类似于:

 Rails.application.eager_load! Forceps.configure Forceps::Remote::Account.find_each do |remote_account| remote_account.copy_to_local end 

Forceps允许您配置要复制的对象 。 默认情况下,它将探索并复制所有关联的对象。 这意味着它会将所有相关数据复制到每个帐户,这可能不是您想要的。

此外,您可以使用远程类#copy_to_local Forceps::Remote::作为任何其他活动记录模型,而不是使用#copy_to_local 。 然后,您可以手动复制所需的任何内容:

 remote_account = Forceps::Remote::Account.find_by_email 'some@email.com' local_account = Account.create!(email: remote_account.email)