代码之家  ›  专栏  ›  技术社区  ›  pragMATHiC

PostgreSQL从STDIN复制不起作用,但从PATH复制起作用

  •  4
  • pragMATHiC  · 技术社区  · 8 年前

    在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文件导入此表。我的方法是使用复制。。。从STDIN而不是复制。。。从“/路径/到/文件”,因为我希望能够 cat 从shell中获取多个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
    

    它成功了。

    使用时为什么会出现此错误 STDIN 使用文件路径时?

    1 回复  |  直到 8 年前
        1
  •  6
  •   Laurenz Albe    8 年前

    因为如果你使用 -f , COPY 将尝试从该文件而不是stdin读取。