Prácticamente, acabo de escribir un ejemplo de cómo hacer esto con archivos de texto sin formato que se aplicarán igualmente bien a xml
archivos Consulte la pregunta actualización de las filas de la tabla según el archivo txt
.
Resulta que puedes hacer esto con 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
Si está haciendo mucho de esto, es posible que desee drive psql
usando un co-proceso
o al menos para generar SQL y canalizarlo a psql
's stdin, por lo que no tiene que hacer toda la configuración/desconexión de la conexión una y otra vez.
Alternativamente, hacerlo con el 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__
La generación de separadores aleatorios es para protegerse contra ataques de inyección (poco probables) que se basan en conocer o adivinar la etiqueta del separador de cotización del dólar.
Vas a ser mucho más cuerdo y feliz si usa un lenguaje de secuencias de comandos adecuado y una biblioteca de cliente PostgreSQL como Perl con DBI
y DBD::Pg
, Python con psycopg2
o Ruby con el Pg
joya para cualquier trabajo no trivial. El trabajo significativo con bases de datos en el shell genera dolor, sufrimiento y un uso excesivo de coprocesos.