Postgresql
Postgres copy from CSV:如何格式化範圍變數?
考慮一個包含範圍變數的 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;