【问题标题】:Rails: Accessing a database not meant for Rails?Rails:访问不适合 Rails 的数据库?
【发布时间】:2010-08-03 23:15:00
【问题描述】:

我有一个标准的 Rails 应用程序,它通过 Active Record 使用 mysql 数据库,通过单独的解析过程从一个相当大的 XML 文件加载数据。

这一切都很好,但现在我需要从 Oracle 数据库而不是 XML 文件加载数据。

我无法控制数据库的外观,只需要它包含的一小部分数据(可能是几个表中的一两列)。因此,我真正想做的是调用数据库,取回数据,并将数据放在我现有的、Rails 友好的 mysql 数据库中的适当位置。

我该怎么做呢?我听说*您可以(在模型的基础上)为 Rails 模型指定不同的数据库来使用,但这听起来像是他们完全使用它们,(也就是说,数据库是 Rails 友好的)。我可以直接拨打 Oracle 电话吗?有没有让这更容易的过程? Active Record 可以自己处理吗?

一个玩具例子:

如果我需要知道对象的颜色、价格和位置,那么通常我会解析一个巨大的 XML 文件来获取这些信息。现在,使用 oracle,颜色、价格和位置都在不同的表中,由一些 ID 索引(实际上没有“对象”表)。我想将所有这些信息整合到我的 Rails 模型中。

编辑:听起来我听说的是 ActiveRecord 的“建立连接”方法......而且它确实似乎假设一个模型映射到目标数据库中的一个表,这在我的情况下是不正确的。

编辑编辑:啊,看来我可能错了。 “建立连接”可能会很好地处理我的情况(首先必须让 ORACLE 工作,我肯定会知道......如果有人可以提供帮助,问题是here

【问题讨论】:

  • 根据我的回答,您编辑中的陈述不正确。

标签: ruby-on-rails oracle


【解决方案1】:

您可以直接创建到 Oracle 的连接,然后让 ActiveRecord 执行原始 SQL 语句来查询您的表(复数)。在我的脑海中,是这样的:

class OracleModel < ActiveRecord::Base
  establish_connection(:oracle_development)

  def self.get_objects
    self.find_by_sql("SELECT...")
  end
end

使用此模型,您可以执行OracleModel.get_objects,它将返回一组记录,其中SELECT SQL 语句中指定的列是每个OracleModel 的属性。显然你可能会想出一个比我更有意义的模型名称!

  • 在您的 config/database.yml 文件中使用您的 Oracle 数据库连接详细信息创建一个名为 :oracle_development 的条目。

【讨论】:

  • 所以...您是说通过执行原始 SQL,我可以访问名称与模型不同的表?有趣,我得看看这个...
  • 是的,这正是我要说的。在这种情况下,模型只是充当包装 SQL 语句的类。
  • 那么,我的 OracleModel 需要在它的迁移中为我想要从 Oracle 中提取的所有内容定义属性(即使它位于 Oracle 中的各种不同表中)?
  • 不,您的 OracleModel(或您所称的任何名称)根本不需要迁移。关键是它的存在纯粹是为了从您的 Oracle 数据库中获取数据。
  • 有什么让oracle开始工作的技巧吗?我遵循了一些教程,并安装了 gem“activerecord-oracle_enhanced_adapter”和“ruby-oci8 -v 1.0.4”,并在正确的位置(在 Windows 中)安装了 oci.dll,但我仍然会遇到运行时错误OracleModel 类型类认为它没有活动记录 gem,而且 ruby​​-oci 太旧了(但任何更新的东西都不会为我编译)
【解决方案2】:

这可能不是您想要的,但它似乎很好地涵盖了您的情况:http://pullmonkey.com/2008/4/21/ruby-on-rails-multiple-database-connections/

看起来你可以在 database.yml 文件中进行任意命名的数据库配置,然后让某些模型像这样连接到它:

class SomeModel < ActiveRecord::Base
  establish_connection :arbitrary_database

  #other stuff for your model
end

因此,解决方案是为您希望从其他数据库中提取数据的表创建 ActiveRecord 模型。然后,如果你真的想进入一些 sql,使用 ActiveRecord::Base.connection.execute(sql)。如果您需要它作为实际的 active_record 对象,请执行 SomeModel.find_by_sql(sql)。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    我没有足够的积分来编辑您的问题,但听起来您真正需要的是为第二个数据库提供另一个“连接池”——我不认为Oracle 本身就是一个问题。

    然后,您需要使用这些备用连接在适当的控制器方法中“简单地”执行自定义查询。

    【讨论】:

    • 不太清楚你的意思是什么?你基本上是在说约翰托普利在下面说的吗?还是有什么不同?
    【解决方案4】:

    如果您只需要从 Oracle 数据库中提取数据,并且如果您有能力将对象添加到可以查看所需数据的架构中。 . . .

    我会通过在 Oracle 表上创建一个视图来简化事情,该视图将您需要的数据投影到 ActiveRecord 的友好形状中。

    这意味着将代码维护到应用程序的两层,但我认为在客户端获得的清晰度将超过成本。

    您还可以使用 CREATE OR REPLACE VIEW Object AS SELECT tab1., tab2. FROM tab1,tab2 语法,以便视图返回每个表中的每一列。

    如果您需要对 Rails 模型进行插入或更新更改,则需要阅读通过视图进行更新的限制。

    (此外,您可能需要搜索让 Oracle 与 Rails 一起工作,因为您可能需要安装 Oracle 客户端软件和其他 Ruby 模块)。

    【讨论】:

    • 呃......不太清楚你的意思......我的意思是,与 Oracle 交谈的目的是填充现有的 MySql 数据库(它已经拥有自己的视图,所有这些都很好而且友好)。 .. 等待。您的意思是数据库意义上的“视图”,而不是“Rails”意义上的“视图”。啊好吧。我不知道我是否可以这样做......(根本不熟悉数据库,并且我无权修改数据库)。
    • 是的,我的意思是一个数据库视图——把它想象成一个命名的 SELECT 语句。创建后,它在客户端看起来就像一张桌子。您可以使用它为 Rails 模型创建缺少的“对象”表。但是,如果您无权修改 D/B,那么这是不可能的 - 您必须将自定义 SQL 直接编码为自定义方法。
    【解决方案5】:

    您是在谈论您的应用程序和 Oracle 数据库之间的一次性数据转换还是一些永久性数据交换?我认为你不应该让 Rails 参与进来。你可以对 Oracle 数据库进行 SQL 查询,提取数据,然后将其插入 MySQL 数据库。

    【讨论】:

    • 我还不完全确定,但有可能每次用户点击某个视图时我都需要从 Oracle 加载数据。不确定每次发生这种情况时我将如何运行一个完全独立的脚本......Ruby 可以运行命令行函数,对吗?也许是这样?
    • 我认为建议是,如果 Oracle DB 中的数据是静态的,那么您可以在 Rails 之外一次性将其拉回。如果它经常变化(即在一天之内),这将不是一个选择。您也可以从 Oracle 端处理它(将更新推送到 mySQL 或 HTTP 调用),但您已经确认您无权修改 Oracle DB。
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多