使用 Python,我使用以下查询将表从 Postgresql 保存到 CSV:
copy ({function}) to stdout with (format csv, delimiter ',', header true, force_quote *);
这个请求在哪里{function}
:select ...
请求本身通过以下方式调用copy_expert
:
with db_connection.cursor() as cursor, open(file_path, "w") as file:
cursor.copy_expert(query, file)
一切正常,只有 null 在最终的 csv 中被写入为空值:
... "1",,,,"9597a9724d4dfd0c40681a0", ...
^^^^
我需要将 null 保存为""
:
... "1","","","","9597a9724d4dfd0c40681a0", ...
^^^^^^^^^^
如果我理解正确的话,COPY函数中的NULL参数表示读取CSV时哪些值被识别为null。
是否可以做相反的事情 - 当写入 CSV null 时,将其写为""
或者只是进入原始选择并使用 COALESCE 将每列的 null 替换为空行 - 因为用空字符串初步手动替换 null 有帮助吗?我想知道是否可以使用 COPY 参数配置所需的行为。
UPD:根据@Mike的评论,COPY TO也可以接受NULL值作为参数,但不能传递双引号:
NULL '' -> осталось также ,,,
NULL "" -> zero-length delimited identifier at or near """"
NULL '''' -> null requires a parameter
NULL '''''' -> null requires a parameter
NULL '""' -> CSV quote character must not appear in the NULL specification
NULL '""""' -> CSV quote character must not appear in the NULL specification
NULL E'\'\'' -> изменилось на ,',',
NULL E'\'\'\'\'' -> изменилось на ,'','',
NULL E'\"\"' -> CSV quote character must not appear in the NULL specification
NULL E'\"\"\"\"' -> CSV quote character must not appear in the NULL specification
感谢@Mike澄清COPY TO 中的 NULL 参数也接受将写入 CSV 的值而不是 NULL 值。
然而,根据测试和文档的字面解释,
COPY
PostgreSQL 中的函数无法将 NULL 包装在定义为 QUOTE 的字符中,根据PostgreSQL 9.5 -“CSV Format”块的文档:默认情况下,QUOTE 是双引号字符
"
。当尝试将它们指定为 NULL 时,会发生错误:例如,这样的调用将导致以下错误:
如果您定义自己的 QUOTE,则该符号
"
将可以访问 NULL:但是,相应地,现在尝试将 NULL 参数设置为
null '~~'
。有两种方法可以摆脱这种情况:
COPY TO
+copy_expert
。因此,在这个问题的框架内,当切换到pandas
with 时,pd.to_csv(quoting=csv.QUOTE_ALL)
所有数据和标题都用双引号引起来,包括。和 NULL。