Prakticky jsem právě napsal příklad, jak to udělat se soubory ve formátu prostého textu, které lze stejně dobře aplikovat na xml
soubory. Viz otázka aktualizace řádků tabulky na základě souboru txt
.
Ukázalo se, že to můžete udělat 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
Pokud toho děláte hodně, možná budete chtít drive psql
pomocí společného procesu
nebo alespoň vygenerovat SQL a převést jej do psql
's stdin, takže nemusíte znovu a znovu nastavovat a rušit připojení.
Případně to udělat pomocí shellu:
#!/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__
Generování náhodného oddělovače má chránit před (nepravděpodobnými) útoky injekce, které se spoléhají na znalost nebo uhodnutí oddělovacího tagu s kotací dolaru.
Bude vás moc rozumnější a šťastnější, pokud používáte správný skriptovací jazyk a klientskou knihovnu PostgreSQL, jako je Perl s DBI
a DBD::Pg
, Python s psycopg2
nebo Ruby s Pg
klenot pro jakoukoli netriviální práci. Významná práce s databázemi v shellu vede k bolesti, utrpení a nadměrnému používání společných procesů.