Handily właśnie napisałem przykład, jak to zrobić ze zwykłymi plikami tekstowymi, które będą miały zastosowanie równie dobrze do xml akta. Zobacz pytanie aktualizowanie wierszy tabeli na podstawie pliku txt
.
Okazuje się, że możesz to zrobić za pomocą 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
Jeśli robisz dużo tego, możesz dysk psql za pomocą współprocesu
lub przynajmniej wygenerować SQL i przesłać go do psql jest standardowe, więc nie musisz w kółko wykonywać całej konfiguracji/zrywania połączenia.
Alternatywnie, robiąc to z powłoką:
#!/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__
Generowanie losowych separatorów ma na celu ochronę przed (mało prawdopodobnymi) atakami wstrzykiwania, które polegają na znajomości lub odgadnięciu znacznika separatora cytowania dolara.
Będziesz dużo rozsądniej i szczęśliwiej, jeśli użyjesz odpowiedniego języka skryptowego i biblioteki klienta PostgreSQL, takiej jak Perl z DBI i DBD::Pg , Python z psycopg2 lub Ruby z Pg klejnot dla każdej niebanalnej pracy. Znacząca praca z bazami danych w powłoce prowadzi do bólu, cierpienia i nadmiernego używania współprocesów.