Удобно, току-що написах пример как да направите това с обикновени текстови файлове, които ще се прилагат еднакво добре към xml
файлове. Вижте въпроса актуализиране на редове на таблица въз основа на txt файл
.
Оказва се, че можете да направите това с 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
Ако правите много от това, може да искате да устройство psql
използване на съвместен процес
или поне да генерира SQL и да го насочи към psql
stdin, така че не е нужно да правите цялата тази настройка/разкъсване на връзката отново и отново.
Като алтернатива го правите с обвивката:
#!/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__
Произволното генериране на разделител е за защита срещу (малко вероятни) атаки за инжектиране, които разчитат на познаване или отгатване на етикета за разделяне на долари.
Ще станеш много по-разумни и щастливи, ако използвате подходящ скриптов език и клиентска библиотека PostgreSQL като Perl с DBI
и DBD::Pg
, Python с psycopg2
или Ruby с Pg
скъпоценен камък за всяка нетривиална работа. Значителна работа с бази данни в обвивката води до болка, страдание и прекомерно използване на съвместни процеси.