Praktisk har jeg lige skrevet et eksempel på, hvordan man gør dette med almindelige tekstfiler, der vil gælde lige så godt for xml
filer. Se spørgsmålet opdatering af tabelrækker baseret på txt-fil
.
Det viser sig, at du kan gøre dette med 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
Hvis du laver meget af dette, vil du måske drev psql
ved hjælp af en co-proces
eller i det mindste at generere SQL og overføre det til psql
's stdin, så du behøver ikke at gøre al den forbindelse opsætning/nedrivning igen og igen.
Alternativt kan du gøre det med skallen:
#!/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__
Generering af tilfældige separatorer er for at beskytte mod (usandsynlige) injektionsangreb, der er afhængige af at kende eller gætte dollar-citat-separator-tagget.
Du kommer til at være meget sundere og gladere, hvis du bruger et ordentligt scriptsprog og PostgreSQL-klientbibliotek som Perl med DBI
og DBD::Pg
, Python med psycopg2
eller Ruby med Pg
perle til ethvert ikke-trivielt arbejde. Betydeligt arbejde med databaser i skallen fører til smerte, lidelse og overdreven brug af co-processer.