2011-10-18 30 views
7

Tôi có một ứng dụng Rails 3, nơi tôi cần phải nhập một tệp XML được cung cấp bởi một hệ thống bên ngoài vào cơ sở dữ liệu Postgres. Tôi muốn sử dụng một cái gì đó như ActiveRecord-Import nhưng điều này không xuất hiện để xử lý khả năng upsert cho Postgres, và một số hồ sơ tôi sẽ được ingesting đã tồn tại, nhưng sẽ cần phải được cập nhật.upsert số lượng lớn với Ruby on Rails

Hầu hết những gì tôi đọc đều khuyên bạn nên viết SQL ngay lập tức, nhưng điều này có vẻ như một vấn đề có thể đã được giải quyết rồi. Tôi không thể tìm thấy nó.

Cảm ơn.

+0

Tôi không chắc Rails là công cụ thích hợp cho việc này. Bạn đã cân nhắc việc thực hiện điều này bên ngoài Rails bằng cách sử dụng các công cụ XML và PostgreSQL hiện có chưa? –

+0

Khi ở trong cơ sở dữ liệu, dữ liệu được chèn sẽ trở thành các mô hình được sử dụng cho các mục đích khác, có thể chỉnh sửa thông qua web, v.v. chúng tôi có các xác nhận hợp lệ và liên kết trên mô hình. Tôi lo lắng rằng việc phá vỡ đường ray sẽ khiến chúng tôi lặp lại rất nhiều công việc và bảo trì khó khăn trên đường. –

+3

Nếu bạn muốn xác thực ActiveRecord chạy, bạn sẽ phải chèn một bản ghi tại một thời điểm. Nếu bạn muốn cập nhật hàng loạt + xác nhận hợp lệ thì bạn sẽ phải thiết lập các xác nhận hợp lệ/ràng buộc ở phía db. Nếu bạn muốn hiệu quả trong trường hợp này, bạn có thể phải thỏa hiệp về khả năng bảo trì mã –

Trả lời

-1

Điều hai bước của nó. Trước tiên, bạn cần tìm nạp tệp XML. Nếu nó được cung cấp bởi một người dùng thông qua một biểu mẫu may mắn cho bạn nếu không bạn cần phải lấy nó bằng cách sử dụng tiêu chuẩn HTTP lib của ruby ​​hoặc nếu không một số đá quý như cơ giới hóa (thực sự thực sự tuyệt vời)

Điều thứ hai thực sự dễ dàng. Bạn đọc tất cả các XML vào một chuỗi và sau đó bạn có thể chuyển đổi nó thành một băm với pice mã này:

Hash.from_xml(xml_string) 

Sau đó, bạn có thể phân tích và làm việc với các dữ liệu ...

+0

Chúng tôi đang sử dụng happymapper để phân tích cú pháp XML và điều đó đang hoạt động tốt. Điều gây khó khăn này là số lượng đối tượng mà chúng ta muốn nhập vào làm cho nó rất chậm nếu chúng ta chèn/cập nhật từng đối tượng một. –

7

Bạn có thể làm upserting trên MySQL và PostgreSQL với upsert.

Nếu bạn đang tìm kiếm tốc độ thô, bạn có thể sử dụng nokogiri và upsert.

Có thể nhập dữ liệu dễ dàng hơn bằng cách sử dụng data_miner, sử dụng nokogiri và upsert nội bộ.

+0

Tôi ước gì tôi thấy câu trả lời này sớm hơn – sheerun

1

Nếu bạn đang sử dụng PostgreSQL 9.1, bạn nên sử dụng các biểu thức bảng phổ biến có thể ghi. Một cái gì đó như:

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

Trong trường hợp này, bạn sẽ cố gắng cập nhật các bản ghi từ cám dỗ theo logic của bạn, sau đó chèn phần còn lại.