如何将具有自定义枚举类型的数据从 csv 插入现有的 PostgreSQL 表

Posted

技术标签:

【中文标题】如何将具有自定义枚举类型的数据从 csv 插入现有的 PostgreSQL 表【英文标题】:How to insert data with custom enum type from a csv into an existing PostgreSQL table 【发布时间】:2018-09-03 17:27:18 【问题描述】:

我想将 csv 文件中的数据插入到 PostgreSQL 数据库上的现有表中 - 我们将表命名为 automobile

我的一个字段是自定义enum - 我们称之为brand

当我尝试使用 DataGrip 内置功能从 csv 文件导入记录时,我收到一条错误消息:

conversion failed: "Ford" to brand

但在以下屏幕截图中,我们可以看到 manufacturer 列填充了预期的字符串值:Ford

我想我必须将字符串显式转换为 brand 类型,但我该怎么做呢?我在导入选项中看不到任何此类选项。 (见下文)。我应该直接在csv文件中做吗?

复制步骤

CREATE TYPE brand AS ENUM ('BMW', 'Renault', 'Ford');

您可以检查您是否声明了 enum 类型:

SELECT enum_range(NULL::brand);

我创建了一个虚拟表,其中 manufacturer 列的类型为 brand

CREATE TABLE automobile (
id int,
manufacturer brand,
registration_number varchar(10),
owner varchar(50));

并在其中插入一些虚拟记录:

INSERT INTO automobile (id, manufacturer, registration_number, owner)
VALUES (1, 'BMW', 'AAA-BBB-ZR', 'John'),
       (2, 'Renault', 'CCC-BWB-PU', 'Mike');

现在我尝试从 csv 文件中导入数据,方法是右键单击我的表格并选择 从文件中导入数据... 我选择导入的 csv 文件包含以下 2 行:

id, manufacturer, registration_number, owner
3,Ford,PZB-URU-LK,Jack

我选择了正确的编码选项并单击“确定”。然后生成错误信息:

2:3: conversion failed: "Ford" to brand

如果我在检查 DataGrip 导入选项时选择选项 Insert inconvertible values as Null,我会收到更详细的错误消息:

2:1: ERROR: column "manufacturer" is of type brand but expression is of type character varying   Hint: You will need to rewrite or cast the expression.   Position: 90

我试图在我的 csv 中指定 Ford::brand 并重新加载并遇到了同样的问题。

如何让 DataGrip 理解 Fordbrand enum 的值?

我已经检查了DataGrip documentation on Import/Export,但找不到我要找的东西。

【问题讨论】:

datagrip 导入工具可能比它应该做的更多(和更糟)。使用原生工具 psql,您可以在其中使用\copy automobile from '/path/to/myfile.csv' (format csv, header) 轻松导入文件。 看看 Datagrip 将您的 CSV 文件翻译成什么会很有用。此信息可能在 Postgresql 日志文件中可用。 【参考方案1】:

最新的 DataGrip 版本按预期处理枚举类型。 The issue 已修复。

【讨论】:

【参考方案2】:

这是一个错误!我们 DataGrip 团队将处理这个问题。期待在进一步的小更新之一中修复。

请关注问题:https://youtrack.jetbrains.com/issue/DBE-7012

【讨论】:

以上是关于如何将具有自定义枚举类型的数据从 csv 插入现有的 PostgreSQL 表的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有数百条记录的现有csv中添加新列并从数组中填充它?

Spark scala Dataframe:如何将自定义类型应用于现有数据框?

自定义核心数据映射:在现有关系之间插入新实体

从具有自定义类型的 c++ 中的 std::map 获取值

Hibernate学习笔记

如何在 iOS 6 中使用具有多个子视图的现有自定义视图自动布局