sql - PostgreSQL COPY FROM STDIN 无效,但 FROM PATH 有效

标签 sql linux postgresql cat

我之前在 PostgreSQL 中创建了一个表,如下所示:

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 文件导入到这个表中。我的方法是使用 COPY ... FROM STDIN 而不是 COPY ... FROM '/path/to/file',因为我希望能够从 shell 中 cat 多个 csv 文件和管道他们到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

它成功了。

为什么在使用 catSTDIN 时会出现此错误,而在使用文件 PATH 时不会出现此错误?

最佳答案

因为如果您使用 -fCOPY 将尝试从该文件而不是标准输入中读取。

关于sql - PostgreSQL COPY FROM STDIN 无效,但 FROM PATH 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48378179/

相关文章:

sql - 使用触发器更新多个表

java - 如何避免自动更改 .CSV 文件中的数据类型

linux - 在大多数基于 Debian 的系统上 gnome-terminal 是否可以被伪造?

postgresql - PostgreSQL 9.0.x 中不推荐使用日期时间变量类型?

java - 在 Spring Boot Hibernate for Postgres 中为特定时区设置 UpdatedTimeStamp

运行相同的查询时,Java 语句executeQuery 返回的结果与 SQLDeveloper 中的结果不同

php - 获取多条记录更新查询根据最后一条记录更新表

python - 如何让 HTML 按钮激活 python 脚本?

linux - Caffe 加载 LMDB 批处理非常慢

postgresql - 使用 "Notice: Relation exists"时抑制 "CREATE ... IF NOT EXISTS"