我尝试将 CSV 文件的内容复制到我的 postgresql 数据库中,但收到此错误“最后一个预期列后有额外数据”。
我的 CSV 内容是
agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone
100,RATP (100),http://www.ratp.fr/,CET,,
我的 postgresql 命令是
COPY agency (agency_name, agency_url, agency_timezone) FROM 'myFile.txt' CSV HEADER DELIMITER ',';
这是我的桌子
CREATE TABLE agency (
agency_id character varying,
agency_name character varying NOT NULL,
agency_url character varying NOT NULL,
agency_timezone character varying NOT NULL,
agency_lang character varying,
agency_phone character varying,
agency_fare_url character varying
);
Column | Type | Modifiers
-----------------+-------------------+-----------
agency_id | character varying |
agency_name | character varying | not null
agency_url | character varying | not null
agency_timezone | character varying | not null
agency_lang | character varying |
agency_phone | character varying |
agency_fare_url | character varying |
现在您有 7 个字段。
您需要将 CSV 中的这 6 个字段映射到表中的 6 个字段。
当您有 6 个字段时,您不能像以下那样只映射 csv 中的 3 个字段:
\COPY agency (agency_name, agency_url, agency_timezone) FROM 'myFile.txt' CSV HEADER DELIMITER ',';
csv 文件中的所有字段都需要映射到命令的副本中。
并且由于您定义了 csv
,
分隔符是默认的,因此您不需要放置它。
不确定这算不算答案,但我只是用一堆 CSV 文件来解决这个问题,发现只需在 Excel 中打开它们并在不进行任何更改的情况下重新保存它们,错误就会消失。 IOTW 源文件中可能存在一些不正确的格式,Excel 能够自动清理这些格式。
如果 postgres 表和 csv 文件中的列数相同,即使您在
delimiter ','
命令中指定了 \copy
,也会发生此错误。您还需要指定 CSV
。
就我而言,我的其中一列包含逗号分隔的数据,我执行:
db=# \copy table1 FROM '/root/db_scripts/input_csv.csv' delimiter ','
ERROR: invalid input syntax for integer: "id"
CONTEXT: COPY quiz_quiz, line 1, column id: "id"
添加后成功了
CSV
:
db=# \copy table1 FROM '/root/db_scripts/input_csv.csv' delimiter ',' CSV
COPY 47871
对于未来的访问者,当我遇到这个问题时,是因为我在将查询提交到数据库(
context)之前使用了一个循环写入相同的
io.StringsIO()
变量。
如果您遇到此问题,请确保您的代码如下所示:
for tableName in tableNames:
output = io.StringsIO()
...
output.seek(0)
cur.copy_expert(f"COPY {tableName} FROM STDIN", output)
conn.commit()
不是这样的:
output = io.StringsIO()
for tableName in tableNames:
...
output.seek(0)
cur.copy_expert(f"COPY {tableName} FROM STDIN", output)
conn.commit()
我可以通过删除标题上的空列来修复它。 你在 Excel 中看不到它,所以你必须使用 vscode。
删除最后一个列标题后多余的逗号,一切就OK了。
我尝试了你的例子,它工作正常,但是......
psql 命令行中的命令丢失了
\
database=# \COPY agency FROM 'myFile.txt' CSV HEADER DELIMITER ',';
下次请包括
DDL
我从 csv 标题创建了
DDL
我刚刚遇到了这个错误,我花了 3 天才找到一个甚至在 YouTube 上都没有的解决方案。 这是最好的方法 1 将 csv 文件插入(复制)到新文件夹中,然后通过右键单击并选择属性和安全性来授予“Everyone”访问权限。 2 在您授予Everyone访问权限后,下一步是将包含您的csv文件的文件夹复制到[program file > postgresql > 14 > data],然后返回使用复制表命令而不是插入表选项。 您的程序文件位于您的 PC 中,您只需找到它的位置,然后查找 postgresql 文件夹。 保重。