用Ruby on Rails批量upsert

时间:2011-10-18 05:31:17

标签: ruby-on-rails ruby postgresql activerecord upsert

我有一个Rails 3应用程序,我需要将外部系统提供的XML文件摄取到Postgres数据库中。我想使用类似ActiveRecord-Import的东西,但这似乎不能处理Postgres的upsert功能,我将要摄取的一些记录已经存在,但需要更新。

我正在阅读的大部分内容都建议动态编写SQL,但这似乎是一个可能已经解决的问题。我找不到它。

感谢。

3 个答案:

答案 0 :(得分:7)

您可以使用upsert对MySQL和PostgreSQL进行插播。

如果您正在寻找原始速度,可以使用nokogiri并进行升级。

使用data_miner导入数据可能更容易,{{3}}在内部使用nokogiri和upsert。

答案 1 :(得分:1)

如果您使用PostgreSQL 9.1,则应使用可写的公用表表达式。类似的东西:

WITH updates (id) AS (
     UPDATE mytable SET .....
      WHERE ....
     RETURNING id
)
INSERT INTO mytable (....)
SELECT ... 
  FROM mytemptable
 WHERE id NOT IN (select id from updates);

在这种情况下,您首先在临时表中批量处理,然后根据您的逻辑尝试更新temptable中的记录,然后插入其余的。

答案 2 :(得分:-1)

这是一个两步的事情。首先,您需要获取XML文件。如果它是由用户通过表单运送给你的,否则你需要使用ruby的标准HTTP库获取它或者其他一些像机械化的宝石(实际上真的很棒)

第二件事很容易。您将所有XML读入一个字符串,然后您可以使用这段代码将其转换为哈希:

Hash.from_xml(xml_string)

然后你可以解析和使用数据......