【问题标题】:How to establish connection from a rake task?如何从 rake 任务建立连接?
【发布时间】:2015-10-12 01:15:49
【问题描述】:

我需要创建一个 rake 任务,从 MySQL 数据库中获取表行,解析数据,然后插入到 Oracle 数据库中。数据库位于两个不同的主机上。

我目前的尝试:

namespace :import_from_mysql do
  class MySQLConnection < ActiveRecord::Base
    self.abstract_class = true
    establish_connection({
    :adapter  => 'mysql',
    :host     => 'xxx.xxx.com',
    :database => 'sample_database',
    :username => 'username',
    :password => 'password'
    })
  end

  class MySQLTable < MySQLConnection
    self.table_name = "users"
    self.primary_key = "id"
    self.inheritance_column = "something_unique_here"
  end

  desc "Parse data before inserting to oracle database"
  task :insert_to_oracle => :environment do |t|
    puts "Rake task has begun...\n\n"
    puts "Parsing data from MYSQL...\n\n"

    MySQLTable.establish_connection

    puts "Rake task has completed!"
  end
end

但是 MySQLTable.establish_connection 建立了到我的本地数据库的连接,即使我正在尝试连接到 mysql_adapter。

当我尝试使用以下命令建立连接时,我能够连接到 MySQL 适配器,但我不知道在建立连接后如何访问我的表:

ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => "sample_database", :host => "xxx.xxx.com", :username => "username", :password => "password" })

知道为什么它一直连接到 sqlite 吗?以及成功建立与mysql的连接后,如何在MySQLTable.establish_connection语句后选择表行?

【问题讨论】:

  • 您打算使用其中一种活动记录模型进行查询吗?
  • 直接执行sql命令就好了。 @adamliesko
  • 那么,看看下面的答案

标签: mysql ruby-on-rails ruby oracle rake


【解决方案1】:

通过使用 ActiveRecord::Base 生成的连接,您可以对连接到的任何数据库执行 SQL 语句。像这样:

connection = ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :host     => "faraway",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)
connection.execute('SELECT * FROM users')

一旦建立,连接也可以从 ActiveRecord::Base 类中引用。

ActiveRecord::Base.establish_connection(...)
ActiveRecord::Base.connection.execute(...)

【讨论】:

  • 我得到了 NoMethodError: undefined method `execute' for #<:connectionadapters::connectionpool:0x00000107a9c8d0>
  • 试图做 connection.connection.execute('SELECT * FROM symbol_events') 它说 NoMethodError: undefined method `init' for Mysql:Class。我可能会错过什么?
  • 我很肯定我的连接是正确的。但我不知道如何处理 Mysql:Class 的未定义方法“init”。
【解决方案2】:

认为它可能对其他人有帮助。以下对我有用!

connection = ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :host     => "faraway",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)

@connection = ActiveRecord::Base.connection
result = @connection.exec_query('SELECT * FROM users')

result.each do |row|
puts row
end

这里,users 是“somedatabase”中已经存在的表。

【讨论】:

    【解决方案3】:

    虽然我是一个有连接和“数据库后台”的菜鸟,但我的简单方法就像一个魅力,并且不需要在 rake 任务中使用参数来更新仅包含定义数据的“域表”,例如法律或帮助文本:

    pre_db = ActiveRecord::Base.establish_connection('preproduction').connection
    
    prod_db = ActiveRecord::Base.establish_connection('online').connection
    

    database.yml 中我定义了数据库。 (在我的情况下,“预生产”是开发和生产之间的一个步骤,以及像“开发”这样的真实环境。其中“在线”与“生产”几乎相同(出于安全原因,我做了一个不同的条目 - 不是为了破坏生产如果database.yml 被上传)

    【讨论】:

      【解决方案4】:

      您可以在 rake 任务中使用 mysql2 gem (https://github.com/brianmario/mysql2)。

      client = Mysql2::Client.new(:host => "localhost", :username => "username", :database => "sample_database", :password => "password")
      users = client.query("SELECT * FROM users")
      

      【讨论】:

      • 另一件事,我将 MySQLConnection 类中的适配器更改为“mysql2”。但是当我删除该类时,上面的代码不再起作用。它说 NameError: uninitialized constant Mysql2
      • 我删除了 MySQLConnection 类,因为连接的配置已经在 Mysql2::Client.new(...) 中定义
      猜你喜欢
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多