2013-03-25 74 views
2

我有幾個XML文件,並希望將其內容插入到PostgreSQL表中。此表有兩列 - id(type serial)和一個xml類型的列,我想在其中插入一個xml文件(一行,一列=一個xml文件)的內容。在文檔中我還沒有找到如何從文件插入xml。從PostgreSQL中的文件插入XML

有沒有一些簡單的方法如何做到這一點?

馬立克

+0

你使用哪種語言和客戶端庫? PostgreSQL版本? – 2013-03-25 09:27:41

+0

PostgreSQL 9.0.7。數據庫將從php代碼(php 5.3)訪問。這是否意味着沒有簡單的(使用PostgreSQL構建)如何將xml文件內容加載到數據庫表列中? – 2013-03-25 09:36:52

+0

這通常由客戶端軟件完成,但我想不出用'psql'做這個簡單的方法。你正在使用哪個SQL客戶端? – 2013-03-25 09:52:38

回答

4

相當方便,我剛寫的如何做到這一點與普通的文本文件,將同樣適用於xml文件的示例。請參閱問題updating table rows based on txt file

事實證明,你可以用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 

如果你正在做大量的這個,你可能想drive psql using a co-process或至少生成SQL和管道將它導入psql的標準輸入,所以您不必一遍又一遍地完成所有連接設置/拆卸。

或者,與外殼做:

#!/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與DBIDBD::Pg,Python來psycopg2或Ruby與Pg寶石任何非瑣碎的工作是理智的,更幸福。與殼數據庫的重大工作導致疼痛,痛苦和過度使用協同過程。

+0

另一種選擇是使用支持「擴展」語法的SQL Workbench/J,例如:insert into foo(id,content)values(42,{$ clobfile ='/ foo/bar.xml')'。 – 2013-03-25 10:25:57

+1

這又如何?如果它適用於文本文件,它也應該與xml文件一起工作http://stackoverflow.com/questions/10968039/postgresql-inserting-value-of-a-column-from-a-file?rq=1我的意思是使用\設定內容'cat file' INSERT INTO testtable VALUES(15,:'content'); – 2013-03-25 10:33:47