向PostgreSQL中加载数据的方法

版权声明:本文为博主原创之文章,未经博主允许谢绝转载。 https://blog.csdn.net/pg_hgdb/article/details/82908730

服务器端

COPY/COPY FROM PROGRAM

COPY用于在PostgreSQL表和标准文件系统文件之间移动数据。COPY TO把一个表的内容复制到一个文件,而COPY FROM则从一个文件复制数据到一个表(把数据追加到表中原有数据)。COPY TO也能复制一个SELECT查询的结果。

带一个文件名的COPY指示PostgreSQL服务器直接从一个文件读取或者写入到一个文件。该文件必须是PostgreSQL用户(运行服务器的用户ID)可访问的并且应该以服务器的视角来指定其名称。当指定了PROGRAM时,服务器执行给定的命令并且从该程序的标准输出读取或者写入到该程序的标准输入。该程序必须以服务器的视角指定,并且必须是PostgreSQL用户可执行的。COPY命令包括多个可选的参数项,例如:

1)FORMAT选项选择要读取或者写入的数据格式,可选择的有text、csv(逗号分隔值)或者binary。默认值是text。

2)DELIMITER选项指定分隔文件每行中各列的字符。文本格式中默认是一个制表符,而CSV格式中默认是一个逗号。这必须是一个单一的单字节字符。使用binary格式时不允许使用这个选项。

3)HEADER选项指定文件包含标题行,其中有每一列的名称。在输出时,第一行包含来自表的列名。在输入时,第一行会被忽略。只有在使用CSV格式时才允许使用这个选项。

4)ENCODING选项指定文件被以encoding_name编码。如果省略这个选项,将使用当前的客户端编码。

此外,推荐在COPY中使用的文件名总是通过一个绝对路径来指定。

大对象存储

从服务器的文件系统将文档和图像加载到数据库表中。这种方法同时使用COPY FROM PROGRAM(PostgreSQL 9.3以上版本)和大对象支持。

如果想要在PostgreSQL中存储二进制数据,例如存储Word、Excel文档,图片文件等,可以使用bytea类型的列。bytea类型是PostgreSQL特有的存储二进制数据的字段类型,与SQL标准中的BLOB和BINARY LARGE OBJECT类型类似。

在PostgresSQL数据库中,大对象(large object)被存储在系统表pg_largeobject中,通过唯一标识符OID来标识。用户自定义表中,可以定义一个oid类型的字段来链接pg_largeobject表中的大对象。

外部数据包装器(FDW)

外部数据包装器负责从远程数据源取得数据并把它返回给PostgreSQL执行器。

FILE_FDW

file_fdw模块提供外部数据包装器file_fdw,它能被用来访问服务器的文件系统中的数据文件,或者在服务器上执行程序并读取它们的输出。数据文件或程序输出必须是能够被COPY FROM读取的格式。当前只能读取数据文件。

POSTGRES_FDW

postgres_fdw模块提供了外部数据包装器postgres_fdw,它可以被用来访问存储在外部PostgreSQL服务器中的数据。

使用postgres_fdw的操作步骤如下:

1)使用CREATE EXTENSION来安装postgres_fdw扩展。

2)使用CREATE SERVER创建一个外部服务器对象,它用来表示你想连接的每一个远程数据库。指定除了user和password之外的连接信息作为该服务器对象的选项。

3)使用CREATE USER MAPPING创建一个用户映射,每一个用户映射都代表你想允许一个数据库用户访问一个外部服务器。指定远程用户名和口令作为用户映射的user和password选项。

4)为每一个你想访问的远程表使用CREATE FOREIGN TABLE或者IMPORT FOREIGN SCHEMA创建一个外部表。外部表的列必须匹配被引用的远程表。但是,如果你在外部表对象的选项中指定了正确的远程名称,你可以使用不同于远程表的表名和/或列名。

现在你只需要从一个外部表SELECT来访问存储在它的底层的远程表中的数据。也可以使用INSERT、UPDATE或DELETE修改远程表。

如果可以的话,通常推荐一个外部表的列被声明为与被引用的远程表列完全相同的数据类型和排序规则。尽管postgres_fdw目前已经能够容忍在需要时执行数据类型转换,但是当类型或排序规则不匹配时可能会发生奇怪的语义异常,因为远程服务器解释WHERE子句时可能会与本地服务器有所不同。

客户端

\copy和\copy FROM PROGRAM

这种方法有几点注意事项:

1)psql客户端需要有权访问这些文件。

2)用户不需要数据库的超级用户权限,但需要拥有对文件的权限。

3)如果postgres服务器和客户端不在同一本地网络上,速度可能会很慢。

在使用\copy命令时,文件的可访问性和访问权限取决于客户端而不是服务器。它将执行一次前端拷贝,运行一个SQL COPY命令,不过不是服务器读取或者写入指定的文件,而是由psql读写文件并且把数据从本地文件系统导向服务器。这意味着文件的可访问性和权限是本地用户的而非服务器上的,并且不需要SQL超级用户特权。

大对象存储    

从客户端的文件系统将文档和图像加载到数据库表中。PostgreSQL提供的大对象接口在libpg库中,常用的PostgreSQL的Python库有PyGreSQL和psycopg2,提供了对大对象的存取访问支持。

By Kalath

猜你喜欢

转载自blog.csdn.net/pg_hgdb/article/details/82908730