PostgreSQL COPY导入CSV报numeric类型输入语法无效问题
报错根本原因
COPY ... CSV HEADER 的列匹配逻辑,是严格按照表定义的列从左到右的顺序,对位CSV文件的列,完全不会根据CSV的表头名称和表的列名做自动匹配。
其中HEADER参数的唯一作用,是告知Postgres跳过CSV第一行的表头文本,不将其作为数据行导入,没有列名匹配的能力。
你现在的列顺序完全错位:
- 建表时定义的列顺序(从左到右):
Title→Sold_Price(数值类型)→Bids(整数类型)→Sold_Date(日期类型)→Card_Link→Image_Link - 本地CSV的列顺序(从左到右):
Title→Sold_Date(日期值)→Sold_Price(价格值)→Bids→Card_Link→Image_Link
错位后,表中定义为数值类型的第2列Sold_Price,实际接收的是CSV第2列的日期文本2021-02-14,直接触发数值解析失败的报错。就算跳过这个报错,后续所有列都会错配:Bids列会收到价格值、Sold_Date列会收到竞价数字,导入后数据完全错乱。
可落地的解决方案
方案1:导入时显式指定列映射(推荐)
不需要修改表结构、也不需要调整CSV文件内容,直接在COPY语句中括号里列出和CSV顺序完全一致的表列名,让Postgres按你指定的对应关系导入即可:
COPY Public."CardData"(Title, Sold_Date, Sold_Price, Bids, Card_Link, Image_Link) FROM 'W:\Python_Projects\cardscrapper_project\ebay_api\card_data_test.csv' DELIMITER ',' CSV HEADER ;
方案2:调整表的列定义顺序
如果希望保持原有COPY语句的写法不改动,就重建表,把列顺序调整为和CSV完全对齐:
CREATE TABLE Public."CardData"( Title text, Sold_Date date, Sold_Price decimal, Bids int, Card_Link text, Image_Link text );
内容的提问来源于stack exchange,提问作者JonShish
相关产品推荐
相关产品推荐

