我有一个 Rails 3 应用程序,我需要将外部系统提供的 XML 文件提取到 Postgres 数据库中。我想使用ActiveRecord-Import 之类的东西,但这似乎无法处理 Postgres 的 upsert 功能,并且我将摄取的一些记录已经存在,但需要更新。
我正在阅读的大部分内容都建议即时编写 SQL,但这似乎是一个可能已经解决的问题。我就是找不到。
谢谢。
我有一个 Rails 3 应用程序,我需要将外部系统提供的 XML 文件提取到 Postgres 数据库中。我想使用ActiveRecord-Import 之类的东西,但这似乎无法处理 Postgres 的 upsert 功能,并且我将摄取的一些记录已经存在,但需要更新。
我正在阅读的大部分内容都建议即时编写 SQL,但这似乎是一个可能已经解决的问题。我就是找不到。
谢谢。
您可以使用upsert在 MySQL 和 PostgreSQL 上进行更新插入。
如果您正在寻找原始速度,您可以使用nokogiri和 upsert。
使用data_miner导入数据可能更容易,它在内部使用 nokogiri 和 upsert。
如果您使用的是 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);
在这种情况下,您首先在临时表中批量处理薄,然后它会尝试根据您的逻辑更新临时表中的记录,然后插入其余部分。
这是一个两步的事情。首先,您需要获取 XML 文件。如果它是由用户通过一种对您来说很幸运的形式提供的,否则您需要使用 ruby 的标准 HTTP 库或其他类似 mechanize 的 gem 来获取它(这实际上非常棒)
第二件事真的很简单。您将所有 XML 读入字符串,然后可以使用以下代码将其转换为哈希:
Hash.from_xml(xml_string)
然后你可以解析和处理数据......