Postgresql,使用Copy函数将结果导出到XML文件

时间:2018-03-09 01:24:21

标签: xml postgresql postgresql-copy

我编写了一些输出XML结果的SQL函数。由于输出大小很大,我需要将它们直接写入xml文件。对此我使用COPY函数如下:

COPY(SELECT generate_xml_file()) TO '/Users/TEMP/test.xml'  

但问题是,然后生成的文件在每个标记的末尾都有\ n字符。我尝试使用以下选项来消除'\ n',但它不起作用:

 COPY(SELECT generate_xml_file()) TO '/Users/TEMP/test.xml' WITH NULL AS ' '

Postgresql中是否提供了任何设施来完成这项工作?

1 个答案:

答案 0 :(得分:1)

\n用于新行,而不是null。如果您使用默认的tsv模式 - 每个新行都表示为\n,以区分新行和新行之间的差异,例如:

t=# copy(select query_to_xml('select datname,null blah from pg_database limit 2',false,true,'')) to stdout;
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n  <datname>postgres</datname>\n</row>\n\n<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n  <datname>t</datname>\n</row>\n\n

所以简单地说csv选项会拯救你,例如:

t=# copy(select query_to_xml('select datname,null blah from pg_database limit 2',false,true,'')) to stdout csv;
"<row xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
  <datname>postgres</datname>
</row>

<row xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
  <datname>t</datname>
</row>

"

https://www.postgresql.org/docs/current/static/sql-copy.html

  

COPY TO将使用Unix样式的换行符(“\ n”)终止每一行。

依旧......

<强>更新

复制到stdout或文件并不重要:

t=# copy(select query_to_xml('select datname,null blah from pg_database limit 2',false,true,'')) to '/tmp/sp.xml' csv;
COPY 1
Time: 0.481 ms
t=# \! cat /tmp/sp.xml
"<row xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
  <datname>postgres</datname>
</row>

<row xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
  <datname>t</datname>
</row>

"