Postgresql

Postgres copy from CSV:如何格式化範圍變數?

  • February 5, 2016

考慮一個包含範圍變數的 Postgres 表:

CREATE TABLE my_table (t_range tsrange, field1 text);

如果我想通過 手動插入一行psql,我可以執行:

INSERT INTO my_table (t_range, field1) VALUES ('[2014-06-02 07:00:00,infinity)'::tsrange, 'sometext');

我不想手動插入行,而是想從 CSV 文件執行批量插入。我創建了一個my.csv使用類似格式(使用管道作為分隔符以避免必須轉義tsrange變數中的逗號並刪除顯式引號字元)的 CSV 文件,其中包含一些內容:

t_range|field1
'[2014-06-02 07:00:00,infinity)'::tsrange|'sometext1'
'[2014-06-02 07:00:00,infinity)'::tsrange|'sometext2'

然後從psql我跑

\copy my_table FROM 'my.csv' DELIMITER '|' QUOTE '''' CSV HEADER;

但這因錯誤而失敗

ERROR:  malformed range literal: "[2014-06-02 07:00:00,infinity)::tsrange"
DETAIL:  Junk after right parenthesis or bracket.
CONTEXT:  COPY my_table, line 2, column t_range: "[2014-06-02 07:00:00,infinity)::tsrange"

我應該如何格式化帶有範圍變數的 CSV 文件以用於\copy?

刪除顯式演員表tstrange工作。新的 CSV 文件看起來像

t_range|field1
'[2014-06-02 07:00:00,infinity)'|'sometext1'
'[2014-06-02 07:00:00,infinity)'|'sometext2'

在我看來,\copy自動嘗試轉換為適當的數據類型很好,但是顯式轉換會導致它窒息。

在這種情況下,還可以通過刪除引號來簡化 CSV 文件:

t_range|field1
[2014-06-02 07:00:00,infinity)|sometext1
[2014-06-02 07:00:00,infinity)|sometext2

並修改導入命令:

\copy my_table FROM 'my.csv' DELIMITER '|' CSV HEADER;

引用自:https://dba.stackexchange.com/questions/128425