我有几个 XML 文件,想将它们的内容插入到 PostgreSQL 表中。该表有两列 - id(序列类型)和一个 xml 类型列,我想在其中插入一个 xml 文件的内容(一行,一列 = 一个 xml 文件)。在文档中,我还没有找到如何从文件中插入 xml。
有一些简单的方法可以做到吗?
马立克
我有几个 XML 文件,想将它们的内容插入到 PostgreSQL 表中。该表有两列 - id(序列类型)和一个 xml 类型列,我想在其中插入一个 xml 文件的内容(一行,一列 = 一个 xml 文件)。在文档中,我还没有找到如何从文件中插入 xml。
有一些简单的方法可以做到吗?
马立克
很方便,我刚刚写了一个示例,说明如何使用纯文本文件执行此操作,该文件同样适用于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
的标准输入中,因此您不必一遍又一遍地进行所有连接设置/拆卸。
或者,使用外壳执行此操作:
#!/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 客户端库(例如带有and的 Perl、带有Python 的 Python或带有gem 的Ruby )来完成任何重要的工作,您将会更加清醒和快乐。在 shell 中对数据库进行大量工作会导致痛苦、痛苦和过度使用协同进程。DBI
DBD::Pg
psycopg2
Pg