postgresql:在标题上强制引用

And*_*ndy 3 sql csv postgresql header quote

我尝试在标题上强制行情.

Copy (
    SELECT *
    FROM "table"
)
TO <path> CSV HEADER FORCE QUOTE *;
Run Code Online (Sandbox Code Playgroud)

有了这个,我得到标题,除了标题之外所有都在引号中.所以我想要完全相反.

TO <path> CSV HEADER FORCE QUOTE HEADER;
Run Code Online (Sandbox Code Playgroud)

TO <path> CSV FORCE QUOTE HEADER;
Run Code Online (Sandbox Code Playgroud)

不工作.

知道如何管理吗?

Cra*_*ger 7

PostgreSQL的COPY支持中没有这样的选项,至少在9.2及更早版本中.正如您已经观察到的那样,标题没有引用 - 或者更确切地说,它们总是处于自动引用模式,因此只有在包含分隔符或其他特殊字符时才引用它们:

\copy (SELECT 1 AS "First Value", 2 AS "Second value", 3 AS "Third value, with comma") TO '/tmp/test.csv' WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *);
Run Code Online (Sandbox Code Playgroud)

生产:

First Value,Second value,"Third value, with comma"
"1","2","3"
Run Code Online (Sandbox Code Playgroud)

您需要通过一个更灵活的外部工具来转换CSV,该工具可以理解所使用的CSV的所有奇怪和美妙的好处,或者使用外部工具直接生成它.

在这种情况下,我通常编写一个简单的Perl或Python脚本,使用perl的DBI和DBD :: Pg或Python的psycopg2查询数据库,并使用适当的CSV库输出所需的CSV方言.这样的脚本往往很简单,它们通常比\copyCSV 更有效,然后解析和重写它.