在Rails中,如何在不同的数据库上执行直接SQL代码?

时间:2020-03-05 18:58:12  来源:igfitidea点击:

就是这种情况。

我正在编写一个Rails应用程序,它将监视某些特定数据库上的数据质量。为了做到这一点,我需要能够在这些数据库上执行直接SQL查询,这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基本连接的技巧。

我需要连接的数据库在设计时未知(即:我无法将其详细信息放在database.yaml中)。相反,我有一个模型" database_details",用户将使用该模型来输入数据库的详细信息,应用程序将在运行时通过这些数据库执行查询。
因此,与这些数据库的连接实际上是动态的,并且仅在运行时解决细节。

我怎样才能做到这一点?

谢谢,
罗洛

解决方案

回答

我们可能可以通过self。Establishment_connection来执行此操作

回答

我们可以使用像这样的调用以编程方式建立连接

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

如我们所见,我们可以用database_model.database_name值替换somedatabase。与adatpter和所有

ActiveRecord :: Base。Establishment_connection文档

那你可以用

ActiveRecord::Base.find_by_sql("select * ")

执行SQL查询。

ActiveRecord :: Base.find_by_sql文档

如果不完整,马特先生是对的

可以在此处找到更多信息(过时但仍对设计方法有用),并记得在完成后重新连接到普通数据库:)

回答

我遇到这样的情况,我必须连接到外部应用程序的数百个不同实例,并且执行的代码类似于以下内容:

def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

这具有不更改模型继承的ActiveRecord :: Base连接的添加好处,因此我们可以针对该连接运行SQL,并在完成操作后丢弃该对象。