PostgreSQL COPY FROM STDIN 无效,但 FROM PATH 有效
PostgreSQL COPY FROM STDIN not working, but FROM PATH works
在 PostgreSQL 中,我之前创建了一个 table,如下所示:
CREATE TABLE IF NOT EXISTS stock_data (
code varchar,
date date,
open decimal,
high decimal,
low decimal,
close decimal,
volume decimal,
UNIQUE (code, date)
);
想法是将多个 csv 文件导入此 table。我的方法是使用 COPY ... FROM STDIN 而不是 COPY ... FROM '/path/to/file',因为我希望能够从 shell 多个 csv 文件和管道中 cat
他们到 sql 脚本。完成此任务的 sql 脚本目前如下所示:
CREATE TEMPORARY TABLE IF NOT EXISTS stock_data_tmp (
code varchar,
ddate varchar,
open decimal,
high decimal,
low decimal,
close decimal,
volume decimal,
UNIQUE (code, ddate)
);
\copy stock_data_tmp FROM STDIN WITH CSV;
INSERT INTO stock_data
SELECT code, to_date(date, 'YYYYMMDD'), open, high, low, close, volume
FROM stock_data_tmp;
DROP TABLE stock_data_tmp;
示例 csv 文件如下所示
AAA,20140102,21.195,21.24,1.16,1.215,607639
BBB,20140102,23.29,2.29,2.17,2.26,1863
CCC,20140102,61.34,0.345,0.34,0.34,112700
DDD,20140102,509.1,50.11,50.09,50.11,409863
来自 shell 我尝试:
cat /path/to/20140102.txt | psql -d my_db_name -f ~/path/to/script/update_stock_data.sql
但是它给了我这个错误:
psql:/path/to/script/update_stock_data.sql:22: ERROR: missing data for column "date"
CONTEXT: COPY stock_data_tmp, line 1: ""
但是,如果在我的脚本中我将 COPY 命令更改为:
\copy stock_data_tmp FROM '/path/to/20140102.txt' WITH csv;
... 只需调用
psql -d my_db_name -f ~/path/to/script/update_stock_data.sql
成功了。
为什么在使用 cat
和 STDIN
时出现此错误,而在使用文件 PATH 时 而不是 ?
因为如果您使用 -f
,COPY
将尝试从该文件而不是标准输入中读取。
在 PostgreSQL 中,我之前创建了一个 table,如下所示:
CREATE TABLE IF NOT EXISTS stock_data (
code varchar,
date date,
open decimal,
high decimal,
low decimal,
close decimal,
volume decimal,
UNIQUE (code, date)
);
想法是将多个 csv 文件导入此 table。我的方法是使用 COPY ... FROM STDIN 而不是 COPY ... FROM '/path/to/file',因为我希望能够从 shell 多个 csv 文件和管道中 cat
他们到 sql 脚本。完成此任务的 sql 脚本目前如下所示:
CREATE TEMPORARY TABLE IF NOT EXISTS stock_data_tmp (
code varchar,
ddate varchar,
open decimal,
high decimal,
low decimal,
close decimal,
volume decimal,
UNIQUE (code, ddate)
);
\copy stock_data_tmp FROM STDIN WITH CSV;
INSERT INTO stock_data
SELECT code, to_date(date, 'YYYYMMDD'), open, high, low, close, volume
FROM stock_data_tmp;
DROP TABLE stock_data_tmp;
示例 csv 文件如下所示
AAA,20140102,21.195,21.24,1.16,1.215,607639
BBB,20140102,23.29,2.29,2.17,2.26,1863
CCC,20140102,61.34,0.345,0.34,0.34,112700
DDD,20140102,509.1,50.11,50.09,50.11,409863
来自 shell 我尝试:
cat /path/to/20140102.txt | psql -d my_db_name -f ~/path/to/script/update_stock_data.sql
但是它给了我这个错误:
psql:/path/to/script/update_stock_data.sql:22: ERROR: missing data for column "date"
CONTEXT: COPY stock_data_tmp, line 1: ""
但是,如果在我的脚本中我将 COPY 命令更改为:
\copy stock_data_tmp FROM '/path/to/20140102.txt' WITH csv;
... 只需调用
psql -d my_db_name -f ~/path/to/script/update_stock_data.sql
成功了。
为什么在使用 cat
和 STDIN
时出现此错误,而在使用文件 PATH 时 而不是 ?
因为如果您使用 -f
,COPY
将尝试从该文件而不是标准输入中读取。