是否可以使用 pgloader 插入和替换行?

Is it possible to insert and replace rows with pgloader?

我的用例如下:我有来自 csv 文件的数据,我需要将其加载到 table(到目前为止一切顺利,这里没有新内容)。可能会发生相同的数据与更新的列一起发送的情况,在这种情况下,我想尝试插入和替换以防重复。

所以我的table如下:

CREATE TABLE codes (
  code            TEXT NOT NULL,
  position_x      INT,
  position_y      INT
  PRIMARY KEY (code)
);

传入的csv文件是这样的:

TEST01,1,1
TEST02,1,2
TEST0131,3
TEST04,1,4

可能会发生在未来某个时候我得到另一个 csv 文件:

TEST01,1,1000 <<<<< updated value
TEST05,1,5
TEST0631,6
TEST07,1,7

现在发生的事情是当我对第一个文件 运行 时,一切都很好,但是当我对第二个文件执行时,我得到了一个错误:

2017-04-26T10:33:51.306000+01:00 ERROR Database error 23505: duplicate key value violates unique constraint "codes_pkey"
DETAIL: Key (code)=(TEST01) already exists.

我使用以下方式加载数据:

pgloader csv.load

我的 csv.load 文件如下所示:

LOAD CSV
     FROM 'codes.csv' (code, position_x, position_y)
     INTO postgresql://localhost:5432/codes?tablename=codes (code, position_x, position_y)

     WITH fields optionally enclosed by '"',
          fields terminated by ',';

我想用 pgloader 做的事情是可能的吗?

我也尝试删除主键的约束,但后来我在 table.

中得到了重复的条目

非常感谢您的帮助。

不,你不能。根据 reference

To work around that (load exceptions, eg PK violations), pgloader cuts the data into batches of 25000 rows each, so that when a problem occurs it's only impacting that many rows of data.

在括号中 - 我的...

您最好的办法是将 csv 加载到具有相同结构的 table,然后在查询的帮助下合并数据(EXCEPTOUTER JOIN ... where null 等等)