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.