在Rails控制台中的数据库之间复制

时间:2014-04-30 19:41:04

标签: ruby-on-rails database rails-console

我有三个数据库:

  • 甲。 mynewapp_psql(Postgres)
  • B中。 old_products_psql(Postgres)
  • ℃。 old_blogposts_mysql(Mysql)

每个都在database.yml

中定义

我正在使用Amynewapp_psql)作为我的新应用的数据库。在这个应用程序中,我希望能够从我的两个旧数据库中复制所选材料。

我的尝试(根据回复更新)

old_db = ActiveRecord::Base.establish_connection(:database => 'old_blogposts_mysql'... etc)
posts = old_db.connection.execute("select * from posts'")
posts.each do |p|
  NewPost.create(:name => p.name.downcase) #NewPost should add Post in A. (mynewapp_psql)
end

它应该从我的旧数据库中获取每个产品,并在新数据库中创建一个新的等效项。

我更喜欢通过控制台进行操作,因为我需要过滤和更改数据,所以无法直接复制数据库。

2 个答案:

答案 0 :(得分:3)

所以你的情况是失去联系之一。如何建立与当前数据库的新连接,以便您的代码变为这样

old_db = ActiveRecord::Base.establish_connection(:database => 'old_blogposts_mysql'... etc)
posts = old_db.connection.execute("select * from posts'")
new_db = ActiveRecord::Base.establish_connection(:database => 'mynewapp_psql'... etc)
posts.each do |p|
  NewPost.create(:name => p.name.downcase) #NewPost should add Post in A. (mynewapp_psql)
end

答案 1 :(得分:1)

控制台不是动态访问数据库的唯一方法。考虑使用每个数据库的ActiveRecord连接为您的目的定制ruby任务。

require 'pg'
require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'postgresql', # or 'mysql2' or 'sqlite3'
  host:     'localhost',
  database: 'canvas_test',
  username: 'joe',
  password: 'shiitake'
)

# EXEC raw SQL
ActiveRecord::Base.connection.execute("SELECT * FROM posts;")

class Post < ActiveRecord::Base
end

# READ all posts
puts Post.count
=> #<Post:0xb96582cc>
=> ...

# CREATE one new post
my_post = Post.new