Tiện tay, tôi vừa viết một ví dụ về cách thực hiện việc này với các tệp văn bản thuần túy sẽ áp dụng tốt như nhau cho xml
các tập tin. Xem câu hỏi cập nhật các hàng trong bảng dựa trên tệp txt
.
Hóa ra bạn có thể làm điều này với psql
:
regress=> CREATE TABLE xmldemo(id serial primary key, blah xml);
regress=> \set test = `cat some.xml`
regress=> INSERT INTO xmldemo(blah) VALUES (:'test');
INSERT 0 1
Nếu bạn đang làm nhiều điều này, bạn có thể muốn ổ psql
sử dụng đồng quy trình
hoặc ít nhất để tạo SQL và chuyển nó vào psql
của stdin, vì vậy bạn không cần phải thực hiện lặp đi lặp lại tất cả việc thiết lập / gỡ bỏ kết nối đó.
Cách khác, làm điều đó với shell:
#!/bin/bash
xmlfilename=$1
sep=$(printf '%04x%04x\n' $RANDOM $RANDOM)
psql <<__END__
INSERT INTO mytable(myxmlcolumn) VALUES (
\$x${sep}\$$(cat ${xmlfilename})\$x${sep}\$
);
__END__
Việc tạo dấu phân tách ngẫu nhiên là để bảo vệ chống lại các cuộc tấn công tiêm (không chắc) dựa vào việc biết hoặc đoán thẻ dấu phân tách báo giá đô la.
Bạn sẽ được nhiều tốt hơn và hạnh phúc hơn nếu bạn sử dụng ngôn ngữ kịch bản thích hợp và thư viện ứng dụng khách PostgreSQL như Perl với DBI
và DBD::Pg
, Python với psycopg2
hoặc Ruby với Pg
đá quý cho bất kỳ công việc không tầm thường. Công việc quan trọng với cơ sở dữ liệu trong shell dẫn đến đau đớn, khổ sở và việc sử dụng quá nhiều đồng quy trình.