【问题标题】:Rails - Create and operate on a temporary table?Rails - 在临时表上创建和操作?
【发布时间】:2021-02-28 22:57:20
【问题描述】:

我的背景是 R 的数据科学,但在我目前的职位上,我正在通过 Rails 和 ActiveRecord 提取数据。我想对我的数据执行转换并创建新列并以临时方式保存它,这样我就可以像常规表一样继续查询它,但实际上不对数据库进行更改。

在 R 中,这可能类似于:

new_table <- old_table[old_table$date >= '2020-01-01']
new_table$average <- mean(new_table$value)

我会使用这个 new_table 并执行我可以对 old_table 执行的任意数量的查询,一旦我关闭我的应用程序,我希望这个临时表也会被删除。

这种特殊的转换很简单,不需要新表,但是例如,我想用我的 new_table 加入许多表。如果我可以执行一次转换然后加入它会更容易,而不是加入 old_table 并每次都执行转换。

【问题讨论】:

  • 当你说它会更容易你关心在源代码中更容易编写和维护什么?还是让数据库引擎更简单、更高效?
  • 源代码当然更容易。我认为数据库引擎也会更容易,因为它似乎计算量较小,因为我只运行一次必要的转换。这不正确吗?
  • 根据您使用的数据库服务器,物化视图可能是您正在寻找的。可以通过一些技巧在 Postgres 和 MySql 中创建一个
  • 您可以使用视图,并且有一些宝石。但是您也可以使用其中一种 SQL 方法或直接访问该系统直接在数据库中创建临时表。这是一个很好的例子...honeybadger.io/blog/…
  • 不清楚您最后所说的“每次”和“关闭应用程序”是什么意思。传统的 Rails 应用程序是 Web 应用程序,并使用 ActiveRecord 进行持久化。在这种情况下,你是如何使用 Rails 的?您是否正在描述您想要跨多个不同的网页视图执行以与数据交互的工作?或者这是您从控制台执行的操作?如果没有更多细节,您的问题将很难回答。

标签: r ruby-on-rails ruby activerecord


【解决方案1】:

由于您的问题含糊不清,我将给出一个可能不适合您使用的一般性答案,但这是目前最好的猜测。有很多方法可以使用 Rails 中的 DB 连接直接查询,如上面我的 cmets 中的链接中所引用。但作为一个实验,我想看看这是否可行,至少在使用 Postgres 的项目中是这样。我希望它与数据库无关,所以我避免直接​​调用数据库连接...

首先在 Rails 控制台中创建一个临时类:

rails c
Loading development environment (Rails...

class MyTempTable < ActiveRecord::Base
end
=> nil

编辑: 除了下面的方法,您还可以这样做来创建表:

MyTempTable.find_by_sql('create temp table temp_tables AS select...')

这将直接从查询创建临时表。然后,如果您想要新临时表中多个表中的数据,则可以使用 join 语句,并且可以添加所需的任何其他列

结束编辑

现在你有了一个类,它可以像一个表一样使用通常的 ActiveRecord 方法。 Rails 现在假定数据库中有一个名为 my_temp_tables 的表(必须是复数)。然后,您可以像这样创建一个临时表(如果您的 DBMS 支持临时表):

MyTempTable.find_by_sql('create temp table my_temp_tables(col1, col2... ')

现在您有了一个包含所需列的临时表。然后,您可以使用

进行 SQL 操作
MyTempTable.find_by_sql('INSERT INTO my_temp_tables SELECT * FROM ....')

然后,您可以像对待 Rails 中的任何其他模型一样对待 MyTempTable。如果您希望一个表中的所有列与另一个表中的某些列连接,则可以如上所述创建临时表,您只需先创建所有列(至少在 Postgres 中,在 MSSQL 中您可能可以创建插入的临时表直接来自 select => join 语句)。如果您是 Rails 新手,您可以通过在现有表上执行此操作来获取列名:

some_columns = SomeTable.column_names
=> ["id", "name", "serial", "purchased", ...]

现在您有了一个列名数组,因此您不必输入所有列名。您可以从各个表中列出您想要的列,将它们剪切并粘贴到create temp table... 语句中,然后将INSERT 连接的数据放入MyTempTable

如果您经常这样做,您可能希望将所有列名的列表保存在一个文本文件中。您还可以创建执行所有这些操作的 Rake 任务并将数据保存为某种格式,或者将其发送到应该去的地方。这样,您可以将所有内容放在一个文件中,您可以运行它,它会创建临时表,完成工作,然后在关闭临时类和表时消失。

您可能想调查一些 Ruby Gems,可能现有的 Gems 可以满足您的某些需求。但作为概念证明,这是可行的。您还可以启动本地 Rails 应用程序并使用脚本将您想要的数据导入表中,然后随意刷新并重新创建它。

任何知道更好方法的 Rails 专家,请添加答案或编辑此答案。这对我来说主要是一个思想实验,因为我想看看它是否可能。

如果您想创建以后可以访问的视图,您可以使用像 https://github.com/scenic-views/scenic 这样的 gem

或者类似的东西可能会感兴趣:https://github.com/igorkasyanchuk/rails_db

【讨论】:

    【解决方案2】:

    听起来您热衷于使用一些结构和工具来处理数据的好处,但不希望数据保留在 db 表中。 也许使用没有表格的模型,例如this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2016-03-06
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      相关资源
      最近更新 更多