当前位置: 首页 > news >正文

PostgreSQL18新功能COPY命令变得更加用户友好

PostgreSQL18新功能COPY命令变得更加用户友好

PostgreSQL 18 于 2024 年 9 月 25 日发布,在所有主要领域引入了许多令人兴奋的新功能。在本系列博客中,我们将深入研究这些功能,并探讨它们如何使数据库开发人员和迁移工程师过渡到 PostgreSQL 受益。

PostgreSQL 18 – COPY 命令的增强功能

COPY 命令是将平面文件(主要以文本或 CSV 格式)加载到 PostgreSQL 中的默认本机选项。如果您是一名数据工程师或数据库开发人员,正在寻找将平面文件加载到 PostgreSQL 中的方法,则必须注意质量检查并封装一种机制来报告或丢弃失败的记录。

在PostgreSQL 16之前,如果计划在数据库端进行质量检查,一种选择是将平面文件加载到暂存表中,所有列都为文本或通用数据类型,然后将合法和丢弃的数据移动到相关表中。在 PostgreSQL 17 及更高版本中,COPY 命令提供了用于处理数据类型不兼容和使用on_error选项记录失败行或记录的选项。

在 PostgreSQL 18 中,这些功能通过REJECT_LIMIT选项进一步增强。如果总体丢弃或错误行数据超出拒绝限制,则复制命令将作为一个整体丢弃。

PostgreSQL 18 – 新的REJECT_LIMIT选项。

让我们首先创建示例目标表和具有故意数据类型不匹配问题的 CSV 文件。示例表还定义了 check 和 NOT NULL 约束。

CREATE TABLE copy18(col1 integer,col2 text DEFAULT 'x'::text,col3 text NOT NULL,col4 text,col5 boolean,col6 date,col7 timestamp without time zoneCONSTRAINT copy18_col4_check CHECK (length(col4) > 2)
);

CSV 文件在以下行中包含数据类型不兼容:

  • Timestamp (4th line)
  • Integer (5th line)
  • Boolean type (7th line)
  • Date (8th line)

以下是test.csv文件的内容:

--test.csv file.
1,a,a,aaaa,yes,20240101,2024-01-01 12:00:00
2,a,a,aaaa,no,20240102,2024-01-01 12:00:00
3,a,a,aaaa,Y,20240103,2024-01-01 12:00:00
4,a,a,aaaa,N,20240104,2024-01-01 12:00:61
a,a,a,aaaa,1,20240103,20240101010101
999999999999999999999999,1,1,1,0,20241201,20240101010101
5,,a,aaaa,adhoc,20241201,2024-01-01 12:00:51
6,,a,aaaa,false,20241301,2024-01-01 12:00:51

在我们的示例中,我们将使用 psql 命令行中提供的客户端copy命令。它是在 RDS 或 Cloud SQL 等云平台上使用托管 PostgreSQL 时的首选选项之一。如果您想知道 COPY 和 copy 之间的区别,请查看此处。

在PostgreSQL 18中使用拒绝限制控制加载期间的数据质量

如果我们尝试使用on_error选项将相同的 CSV 加载到 PostgreSQL 17 中,它将处理数据并丢弃所有错误,而对总错误数没有任何限制。

postgres=# \copy copy18 from 'test.csv' (on_error ignore, format csv, log_verbosity verbose);
NOTICE:  skipping row due to data type incompatibility at line 4 for column "col7": "2024-01-01 12:00:61"
NOTICE:  skipping row due to data type incompatibility at line 5 for column "col1": "a"
NOTICE:  skipping row due to data type incompatibility at line 6 for column "col1": "999999999999999999999999"
NOTICE:  skipping row due to data type incompatibility at line 7 for column "col5": "adhoc"
NOTICE:  skipping row due to data type incompatibility at line 8 for column "col6": "20241301"
NOTICE:  5 rows were skipped due to data type incompatibility
COPY 3
postgres=# table copy18;
┌──────┬──────┬──────┬──────┬──────┬────────────┬─────────────────────┐
│ col1 │ col2 │ col3 │ col4 │ col5 │    col6    │        col7         │
├──────┼──────┼──────┼──────┼──────┼────────────┼─────────────────────┤
│    1 │ a    │ a    │ aaaa │ t    │ 2024-01-012024-01-01 12:00:00 │
│    2 │ a    │ a    │ aaaa │ f    │ 2024-01-022024-01-01 12:00:00 │
│    3 │ a    │ a    │ aaaa │ t    │ 2024-01-032024-01-01 12:00:00 │
└──────┴──────┴──────┴──────┴──────┴────────────┴─────────────────────┘
(3 rows)

如果我们需要控制错误的行并仅在限制范围内接受它,REJECT_LIMIT有助于实现它。它适用于on_error选项。

postgres=# \copy copy18 from 'test.csv' (on_error ignore, reject_limit 3, format csv, log_verbosity verbose);
NOTICE:  skipping row due to data type incompatibility at line 4 for column "col7": "2024-01-01 12:00:61"
NOTICE:  skipping row due to data type incompatibility at line 5 for column "col1": "a"
NOTICE:  skipping row due to data type incompatibility at line 6 for column "col1": "999999999999999999999999"
NOTICE:  skipping row due to data type incompatibility at line 7 for column "col5": "adhoc"
ERROR:  skipped more than REJECT_LIMIT (3) rows due to data type incompatibility
CONTEXT:  COPY copy18, line 7, column col5: "adhoc"

当REJECT_LIMIT设置为 3 时,对于第 4 个错误,它失败了 COPY 命令。

附加LOG_VERBOSITY静音选项

LOG_VERBOSITY还提供了一个附加选项 silent 以限制打印或记录的信息。

postgres=# \copy copy18 from 'test.csv' (on_error ignore, reject_limit 5, format csv, log_verbosity silent);
COPY 3

结论

使用 PostgreSQL 18 的数据库开发人员可以利用 COPY 命令上新引入的功能:

  • 基于REJECT_LIMIT的选项上基于数据类型不兼容拒绝数据加载ON_ERROR
  • 改进了日志记录,LOG_VERBOSITY具有silent选项。

这些功能简化了数据加载并确保更高的数据质量。

http://www.dtcms.com/a/596578.html

相关文章:

  • 医疗小程序05完善就诊人信息
  • idea AI编程 腾讯云代码助手 CodeBuddy插件安装和使用
  • 湖南益阳网站建设做地坪网站
  • 02-SQLite 为了防止多人同时乱写,把整个数据库文件“当一本账本加锁”
  • 盲盒抽赏小程序一番赏 + 无限赏拓展玩法分析:技术赋能与商业破局
  • 专业网站开发价格wordpress打开自定义很慢
  • 济南建站公司电话网页界面设计与制作邓文达
  • Mysql主从架构的搭建
  • MySQL数据库:表的增删改查 [CRUD](进阶)
  • AI+云计算互融共生,2025AI云产业发展大会即将举行
  • 基于YOLO的深度学习框架用于从胸部X射线图像检测肺炎
  • spring cloud微服务常用组件
  • 工业通信的“钢铁心脏”:耐达讯自动化Profibus光纤模块,为机械手臂提供持久动力
  • 【Kafka全攻略】Kafka从入门到实战:核心概念+实操配置+故障排查全攻略
  • 基于SpringBoot的新闻管理系统【协同过滤推荐算法+可视化统计】
  • 展示型网站方案C语言做网站需要创建窗口吗
  • 电脑硬盘数据恢复原理及核心技术解析
  • 潍坊网站建设制作几分钟弄清楚php做网站
  • Hadoop在AI时代如何实现生态协同? CMP 7.13(或类 Cloudera CDP7.3 的 CMP 7.13 平台,如华为鲲鹏 ARM 版)
  • 麒麟系统离线安装Rabbitmq
  • 【大模型训练】megatron分布式并行训练的调用流程,关键函数forward_backward_func
  • 基于 C++和 Python 实现计算机视觉
  • watch监视reactive对象类型数据
  • 【Linux进阶系列】:线程(下)
  • 网站提示域名重定向怎么做网上有哪些接单做效果图的网站
  • 分布式专题——52 ElasticSearch自定义分词需求实战
  • 网站目的什么公司做网站最好
  • VS2026+QT6.9+ONNX+OPENCV+YOLO11(目标检测)(详细注释)(附测试模型和图像)
  • RestTemplate 和 Apache HttpClient 实现 HTTP 请求
  • Lua 变量