如果您严重依赖PostgreSQL COPY命令将数据快速加载到PostgreSQL中,PostgreSQL 12提供了一项可能对您非常有益的功能。批量加载是一项重要的操作,这方面的每一项改进肯定会帮助许多人,他们希望尽快将数据导入PostgreSQL。
COPY:尽快加载和卸载数据
仔细看看PostgreSQL 12中COPY命令的语法,你会很快看到两件事:
• \h 现在将正确指向文档页面• COPY现在支持WHERE条件
以下是完整的语法概述:
db12=# \h COPYCommand: COPYDescription: copy data between a file and a tableSyntax:COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | PROGRAM 'command' | STDIN } [ [ WITH ] ( option [, ...] ) ] [ WHERE condition ] COPY { table_name [ ( column_name [, ...] ) ] | ( query ) } TO { 'filename' | PROGRAM 'command' | STDOUT } [ [ WITH ] ( option [, ...] ) ] where option can be one of: FORMAT format_name FREEZE [ boolean ] DELIMITER 'delimiter_character' NULL 'null_string' HEADER [ boolean ] QUOTE 'quote_character' ESCAPE 'escape_character' FORCE_QUOTE { ( column_name [, ...] ) | * } FORCE_NOT_NULL ( column_name [, ...] ) FORCE_NULL ( column_name [, ...] ) ENCODING 'encoding_name' URL: https://www.postgresql.org/docs/12/sql-copy.html复制
有一个指向文档的链接当然很好,但是添加到PostgreSQL 12中的WHERE条件可能更重要 。这个新功能的目的是什么?到目前为止,可以完全导入文件。但是,在某些情况下,人们通常只想加载数据子集,并且必须编写大量代码来在导入之前过滤数据或者已经将数据写入数据库。
COPY ... WHERE:导入数据时应用过滤器
PostgreSQL数据可以在轻松导入时进行过滤。COPY变得非常灵活,并且有很多技巧。为了向您展示新的WHERE子句如何工作,我编写了一个简单的示例:
db12=# CREATE TABLE t_demo AS SELECT * FROM generate_series(1, 1000) AS id;SELECT 1000复制
首先生成1000行以确保我们获得了一些数据。然后我们将此表的内容导出到一个文件:
db12=# COPY t_demo TO '/tmp/file.txt';COPY 1000复制
最后,我们可以尝试再次导入此数据:
db12=# CREATE TABLE t_import (x int);CREATE TABLEdb12=# COPY t_import FROM '/tmp/file.txt' WHERE x < 5;COPY 4db12=# SELECT * FROM t_import; x --- 1 2 3 4(4 rows)复制
正如您所看到的,过滤数据非常简单且非常直接。这里要注意的一件重要事情是:我导出了一个“id”列并将其导入为“x”。请记住,文本文件不知道目标表的数据结构 - 您必须确保过滤要导入的表的列名。
重新审视旧版本的COPY
如果您不熟悉PostgreSQL,我还想提供一个较旧的功能,我个人非常喜欢。COPY可以将数据发送到UNIX管道或从管道读取数据。下面是它的工作原理:
db12=# COPY t_demo TO PROGRAM 'gzip -c > tmp/file.txt.gz';COPY 1000db12=# COPY t_import FROM PROGRAM 'gunzip -c tmp/file.txt.gz' WHERE x BETWEEN 100 AND 103;COPY 4db12=# SELECT * FROM t_import WHERE x >= 100; x ----- 100 101 102 103(4 rows)复制
在某些情况下,您可能希望做的不仅仅是导出数据。在这种情况下,我决定在导出时压缩数据。在再次导入数据之前,它将被解压缩并再次进行过滤。如您所见,以灵活的方式组合这些功能非常简单。
如果您想了解有关PostgreSQL和一般加载数据的更多信息,请查看我们关于规则和触发器的帖子。如果您想了解有关COPY的更多信息,请查看PostgreSQL文档 。
本文翻译自:https://www.cybertec-postgresql.com/en/tech-preview-improving-copy-and-bulkloading-in-postgresql-12/