postgresql 使用psycopg3使用COPY查询TO STDOUT获取列名

evrscar2  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(267)

如何在使用psycopg3COPY TO STDOUT功能获取数据时获取列名,例如:copy (select a, b, c, from t1 join t2 using (t1_id) where not t1.is_test) to STDOUT功能?因为这不是简单的从表中选择,所以我不能从元数据中获得表列的名称。
如果我尝试执行COPY (query) TO STDOUT WITH CSV HEADER(如这里所述https://stackoverflow.com/a/70598136/1828296),我会得到错误psycopg.DataError: bad copy format: got a newline before the end of the row
另一种方法是执行常规的select query limit 0并从结果中获取列名,但如果查询很长/很大,这将使获取结果所需的时间/资源加倍,因为我必须执行两次。

请注意:

这将在psql中很好地工作,似乎这不是SQL语法问题,而是psycopg3库问题。
在他们的文档(psycopg.org/psycopg3/docs/basic/...)中,他们说:* 不得指定COPY选项,如FORMAT CSV、DELIMITER、NULL:请不要理会这些细节,谢谢 *。我想知道是否有一些解决方法。

f45qwnt8

f45qwnt81#

在查询中分配的列别名将自动用作列名。错误可能是由语法不正确引起的。请看下面的例子:

COPY (SELECT 'hi' AS greet, 8 AS value) TO STDOUT (FORMAT 'csv', HEADER);
greet,value
hi,8
mwg9r5ms

mwg9r5ms2#

从这里复制 * 逐块复制 *

with open('cp.csv', 'wb') as csv_file:
    with cur.copy("COPY (select c.category, c.descript from cell_per AS cp join category AS c on cp.category = c.category where cell_per = 18) TO STDOUT WITH (FORMAT CSV, HEADER)") as copy:
        for data in copy:
            csv_file.write(data)

cat cp.csv
category,descript
GER SC 3.5,Scented Geraniums 3.5 in.
HERB 3.5,Herbs 3 1/2 in.
H PREM 3.5,Premium Herbs 3 1/2 inch
SUCCULENTS,Succulents

相关问题