使用 PostgreSQL 时使用 COPY 命令处理错误

Posted

技术标签:

【中文标题】使用 PostgreSQL 时使用 COPY 命令处理错误【英文标题】:Handle error with COPY command when using PostgreSQL 【发布时间】:2016-01-31 14:34:30 【问题描述】:

我有一个 Python 脚本正在执行以下命令来将 CSV 文件的内容复制到数据库:

copy_query = "COPY table_name FROM STDIN DELIMITER '%s' CSV HEADER QUOTE '\"';" % (self.delimiter)

table_name 表示已创建的具有特定类型的表。 CSV 文件中的数据并不总是与列类型匹配。例如,CSV 文件可能是这样的:

"row1", 123, "2012-11-11"
"row2", 346, "2012-11-12"
"row3", \N,  "2012-11-12"

如您所见,第 2 列的类型应该是 int,但由于第 3 行的数据与 int 类型不匹配,因此整个操作失败。有没有办法完全拒绝这一行?我希望它填写一些适当类型的默认值,但是完全拒绝该行也可以。感谢您的帮助!

【问题讨论】:

目前(至少 9.5 和更早版本)PostgreSQL 无法让您像这样转换或过滤 COPY 中的行。通常的解决方案是导入一个包含所有text 列的临时/未记录表,然后执行insert into ... select ... 对其进行转换。查看许多现有的相关答案。 Copy NULL values present in csv file to postgres的可能重复 【参考方案1】:

您无法使用 COPY 命令执行此操作,但您可以修改目标表以接受这些数字字段的 NULL。

【讨论】:

以上是关于使用 PostgreSQL 时使用 COPY 命令处理错误的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL - \copy 命令

Django:RunSQL:使用 PostgreSQL COPY 命令

PostgresSQL使用Copy命令能大大提高数据导入速度

Postgresql 锁和 copy_expert

在 PostgreSQL 中使用 COPY FROM 命令在多个表中插入

COPY命令在字符串值中使用逗号 - Postgresql 10