【问题标题】:Is there a package for object-relational mapping in R?R中是否有用于对象关系映射的包?
【发布时间】:2012-08-12 20:27:44
【问题描述】:

(通过对象关系映射,我的意思是这里描述的内容:Wikipedia: Object-relational mapping。)

我可以这样想象 R 中的这项工作:一种“虚拟数据框”链接到数据库,并在访问时返回 SQL 查询的结果。例如,head(virtual_list) 实际上会返回映射数据库上(select * from mapped_table limit 5) 的结果。

我找到了这个post by John Myles White,但过去 3 年似乎没有任何进展。

是否有实现此功能的工作包?

如果没有,

  1. 有用吗?
  2. 实现它的最佳方法是什么(S4?)?

【问题讨论】:

  • Oracle 有一个产品可以在 R...

标签: r orm dplyr rmysql


【解决方案1】:

看起来约翰·迈尔斯·怀特已经放弃了。

here 解释了一些解决方法。

【讨论】:

    【解决方案2】:

    有一个旧的不受支持的软件包 SQLiteDF 可以做到这一点。从源代码构建它并忽略大量错误消息。

    > # from example(sqlite.data.frame)
    >
    > library(SQLiteDF)
    > iris.sdf <- sqlite.data.frame(iris)
    > iris.sdf$Petal.Length[1:10] # $ done via SQL
     [1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5
    

    【讨论】:

      【解决方案3】:

      我不认为它会有用。 R 不是真正的 OOP 语言。 R 中的“中心”数据结构是数据帧。这里不需要对象关系映射。你想要的是 SQL 表和数据帧之间的映射,而 RMySQL 和 RODBC 提供了这样的映射:

      dbGetQuery 在数据框中返回查询结果,dbWriteTable 在表中插入数据或进行批量更新(从数据框)。

      【讨论】:

      • 我不同意这种观点:没有任何有用的语言是“纯粹”的任何特定类型的。 R 声称是一种函数式语言,但它也允许许多副作用。 R 应该有办法创建一个 ORM,我很高兴dplyr 加紧了。
      【解决方案4】:

      作为一个有经验的 R 用户,我不会使用这个。首先,这个“虚拟框架”使用起来会很慢,因为您经常需要在 R 内存和数据库之间进行同步。它还需要锁定数据库表,否则会由于同时发生其他编辑而导致无法预测的结果。

      最后,我认为 R 不适合对 promise 对象进行不同的评估。执行 myFrame$foo[ myFrame$foo &gt; 40 ] 仍将获取完整的 foo 列,因为您无法实现从 R 到 SQL 的完整转换方案。

      因此,我更喜欢从查询中加载 dataframe(),使用它,并在需要时将其写回数据库。

      【讨论】:

      • 感谢您的回答。我同意内存和锁定。这可能是一个问题,具体取决于项目。关于行选择的例子:一个完整​​的翻译方案可能是不可能的,但至少很多常见的操作应该是可行的(例如,例子中的行选择是微不足道的)......
      • 行选择示例对您来说是微不足道的。让我们更进一步:前 10% 的百分位数?随机 n=100 采样?等等……在实践中,很快就达到了极限。
      【解决方案5】:

      最近的包dplyr 正在实现这一点(以及其他惊人的功能)。

      以下是函数src_mysql()的示例说明:

      # Connection basics ---------------------------------------------------------
      # To connect to a database first create a src:
      my_db <- src_mysql(host = "blah.com", user = "hadley",
        password = "pass")
      # Then reference a tbl within that src
      my_tbl <- tbl(my_db, "my_table")
      
      # Methods -------------------------------------------------------------------
      batting <- tbl(lahman_mysql(), "Batting")
      dim(batting)
      colnames(batting)
      head(batting)
      

      【讨论】:

      • dplyr 不支持将对象持久化到数据库中(您仍然需要编写 INSERT INTO 语句)。有办法做到这一点,但不推荐:stackoverflow.com/a/26784801/3910619
      • 这不是 ORM 方法。这只是从数据库中拉出一个表并将其转换为 data.frame/tbl。适当的 ORM 将数据库的条目(包括它们的关系)映射到编程语言中的对象/类。
      【解决方案6】:

      在用于查询 DB 的各种驱动程序包旁边(DBI、RODBC、RJDBC、RMySql...) 还有dplyr,还有sqldfhttps://cran.r-project.org/web/packages/sqldf/

      这将自动将数据帧导入数据库并让您通过 sql 查询数据。最后数据库被删除。

      【讨论】:

        猜你喜欢
        • 2016-05-14
        • 2011-04-24
        • 1970-01-01
        • 2013-05-27
        • 2012-03-08
        • 2022-01-26
        • 1970-01-01
        相关资源
        最近更新 更多