Postgres COPY 到带有双引号的 hstore 字段

Postgres COPY into hstore field with double quote in value

几个小时以来,我一直在尝试使用 COPY 命令从 CSV 文件填充 Postgres 12 数据库。有问题的 table 有一个 hstore 字段,其中一个键值对在值中有一个双引号 "

Postgres 数据库是这样创建的

CREATE TABLE test ( 
    title VARCHAR(20),
    tags hstore
);

CSV 文件使用 tabs 作为分隔符,看起来像这样

My Title | name=>"""Paul "Butch" Newman""", job=>actor

名称值需要用双引号引起来并转义,因为它包含空格。

| 表示一个制表符

我的导入语句如下所示:

COPY test (title, tags) 
FROM '/var/lib/postgresql/data/test.csv'
DELIMITER E'\t' CSV ENCODING 'UTF8';

数据库按预期填充,但是当我用

查询它时

SELECT tags->'name' as name FROM test;

pgAdmin 4 returns

Paul Butch Newman

而不是

Paul "Butch" Newman

我的问题是如何将双引号放入实际的 hstore 值中?

我找到了很多关于导入文本字段的双引号的答案。但是这里导入到 hstore 字段中,并且该值需要在此处用双引号引起来,因为它包含空格。

谢谢!

我刚在本地玩过这个。

我假设您可以控制输入文件的格式。

问题是 CSV 格式将在用双引号括起的元素中找到的 "" 转换为 " 时传递它们。

这让我得到了你想要的结果:

My Title | name=>"""Paul \""Butch\"" Newman""", job=>actor

CSV 处理程序通过将双引号转换为单引号完成转义后,它会将 name=>"Paul \"Butch\" Newman", job=>actor 传递给 insert,这就是您将其作为文字编写的方式psql 或 PgAdmin。

select tags->'name' as name
  from test_hstor;

        name         
---------------------
 Paul "Butch" Newman
(1 row)

出于好奇,我检查了是否将其导入为文本而不是 csv,并且输入记录必须包含 name=>"Paul \"Butch\" Newman", job=>actor 才能正常工作。