我正在尝试将CSV中的数据导入到表中.问题在于,即使使用CSV HEADER,也会根据列索引导入CSV,而不是在该列的标题上导入.
CREATE TABLE denominations (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE churches (
id SERIAL PRIMARY KEY,
-- NOT relevant here
address_id INTEGER REFERENCES addresses,
denomination_id INTEGER NOT NULL REFERENCES denominations,
name VARCHAR(100) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我的CSV看起来像:
id,name
1,Southern Baptist Convention
2,Nondenominational
3,Catholic
4,Presbyterian
id,denomination_id,name,address_id
1,1,Saddleback Church,
2,4,First Presbyterian Church,
3,3,St. Elizabeth's Church,
4,3,St Monica Catholic Community,
5,2,Modern Day Saints Church,
6,4,Second Presbyterian Church,
Run Code Online (Sandbox Code Playgroud)
我的COPY命令在bash中看起来像这样:
psql -d vacation -c "COPY denominations FROM '$PWD/data/Data - Denominations.csv' WITH DELIMITER ',' CSV HEADER;"
psql -d vacation -c "COPY churches FROM '$PWD/data/Data - Churches.csv' WITH DELIMITER ',' CSV HEADER;"
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ERROR: invalid input syntax for integer: "Saddleback Church"
CONTEXT: COPY churches, line 2, column denomination_id: "Saddleback Church"
Run Code Online (Sandbox Code Playgroud)
现在,我要重新排列CSV中的列,但这不应该有效吗?
Pat*_*ick 10
COPY默认情况下,该命令按照表中列的默认顺序从CSV文件中复制列.输入上的HEADER选项被忽略,它基本上只通知后端忽略输入的第一行.如果CSV中列的顺序与表中列的顺序不匹配,则可以显式指定列顺序以匹配CSV文件的布局:
COPY churches (id,denomination_id,name,address_id)
FROM '$PWD/data/Data - Churches.csv'
WITH DELIMITER ',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
以下是使用 csv 标题行导入用户的单行示例:
echo "\copy users ($(head -1 users.csv)) FROM 'users.csv' DELIMITER ',' CSV HEADER" | psql
Run Code Online (Sandbox Code Playgroud)
或者使用 gzip:
echo "\copy users ($(gzip -dc users.csv.gz | head -1)) FROM PROGRAM 'gzip -dc users.csv.gz' DELIMITER ',' CSV HEADER" | psql
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3683 次 |
| 最近记录: |