Массовая упаковка с Ruby on Rails - PullRequest
7 голосов
/ 18 октября 2011

У меня есть приложение на Rails 3, где мне нужно вставить XML-файл, предоставленный внешней системой, в базу данных Postgres.Я хотел бы использовать что-то вроде ActiveRecord-Import , но, похоже, это не поддерживает возможности upsert для Postgres, и некоторые записи, которые я буду принимать, уже будут существовать, но их нужно будет обновить.*

Большая часть того, что я читаю, рекомендует писать SQL на лету, но это похоже на проблему, которая, возможно, уже решена.Я просто не могу его найти.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 05 июля 2012

Вы можете выполнить upserting на MySQL и PostgreSQL с помощью upsert .

Если вы ищете сырую скорость, вы можете использовать nokogiri и upsert.*

Может быть проще импортировать данные, используя data_miner , который использует nokogiri и внутренне защищает.

1 голос
/ 29 сентября 2012

Если вы используете 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);

В этом случае вы сначала массово обрабатываете тонкие файлы во временной таблице, а затем попытаетесь обновить записи из временной таблицы в соответствии с вашей логикой и вставить остальные.

0 голосов
/ 18 октября 2011

Это два шага. Сначала вам нужно получить файл XML. Если он предоставлен пользователем через форму, которая удачна для вас, в противном случае вам нужно получить его, используя стандартную HTTP-библиотеку ruby, или каким-то другим способом, например, механизировать (что на самом деле действительно здорово)

Второе действительно легко. Вы читаете весь XML в строку, а затем можете преобразовать его в хеш с помощью этого кусочка кода:

Hash.from_xml(xml_string)

Тогда вы можете анализировать и работать с данными ...

...