【问题标题】:Copy between databases in Rails console在 Rails 控制台中的数据库之间复制
【发布时间】:2014-06-17 06:45:17
【问题描述】:

我有三个数据库:

  • A. mynewapp_psql (Postgres)
  • 乙。 old_products_psql (Postgres)
  • C. old_blogposts_mysql (Mysql)

每个都在database.yml中定义

我使用A (mynewapp_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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      控制台并不是动态访问数据库的唯一方法。考虑为每个数据库使用 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
      

      【讨论】:

      • 谢谢,这让我更接近了一点。但这不会只是连接到另一个数据库(同时保留与原始数据库的连接)吗?我的意思是,最后一行“my_post = Post.new”将不只是在 canvas_test 数据库中创建一个新的 Post(而不是在我正在创建的原始 mynewapp_psql 数据库中)?
      • result = ActiveRecord::Base.connection.execute("SELECT * FROM posts;") - 我想这真的是我唯一需要的。然后我可以使用结果(例如 result.first)来获取数据。再次感谢!
      • 对多个 cmets 感到抱歉。我意识到这并不能真正解决问题,因为如果我建立与我的 mysql-database 的连接,我将无法再在控制台中访问我的原始数据库(我真的很想使用控制台)。
      • 你的说法是错误的,你可以打开多个连接。
      • 啊,@the Areba 必须让你明白。哦,很高兴为您提供帮助。
      猜你喜欢
      • 2021-03-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      相关资源
      最近更新 更多