psycopg2.DataError:双精度类型的输入语法无效:“ NULL”

时间:2019-03-04 16:04:01

标签: python-3.x postgresql csv psycopg2

我正在尝试使用来自命令的副本和Python psycopg2库上传CSV文件。我知道该错误源于尝试将char值插入双精度列中,但是在创建csv文件时我将空值指定为"NULL",在Postgres复制命令中我也将空值指定为{{1} },所以我不确定为什么上传时不转换这些值。

创建csv文件:

"NULL"

将文件上传到Postgres:

with file_path.open(mode='w', newline='') as outfile:
    csv_writer = csv.writer(outfile, delimiter=delimiter, quoting=csv.QUOTE_NONNUMERIC)

    if include_headers:
        csv_writer.writerow(col[0] for col in self.cursor.description)
    for row in self.cursor:
        csv_writer.writerow(['NULL' if value is None else value for value in row])

错误:

sql = """COPY {table} FROM STDIN WITH (DELIMITER '{sep}', NULL 'NULL', FORMAT CSV, HEADER True);""".format(table=table, sep=sep)

with open(file) as f:
    self.cursor.copy_expert(sql=sql, file=f, size=size)
self.commit()

1 个答案:

答案 0 :(得分:1)

您应该使用QUOTE_MINIMAL,否则您的None将在文件中显示为"NULL"(包括引号),这就是{{1 }}。

但是我认为您不必经历所有这一切,因为COPY可以处理CSV文件就可以了。打开文件并使用COPYcopy_from方法。