我有一个Rails 3应用程序,我需要将外部系统提供的XML文件摄取到Postgres数据库中。我想使用类似ActiveRecord-Import的东西,但这似乎不能处理Postgres的upsert功能,我将要摄取的一些记录已经存在,但需要更新。
我正在阅读的大部分内容都建议动态编写SQL,但这似乎是一个可能已经解决的问题。我找不到它。
感谢。
答案 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)
然后你可以解析和使用数据......