# PostgreSQL

本节介绍如何使用 PostgreSQL 目标连接器配置与 PostgreSQL 目标的连接。PostgreSQL 只能在复制任务中用作目标。在连接到 PostgreSQL 目标之前，您需要在数据库上配置 [所需的权限](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/postgresql-target.htm#Permissi)。如果您通过 数据移动网关 连接到 PostgreSQL，还需要安装[驱动程序设置](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/postgresql-target.htm#Driver)中所述的驱动程序。

有关使用 PostgreSQL 连接器时的限制和注意事项的信息，请参阅[限制和考虑事项](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/postgresql-target.htm#Limitati)。

## 设置连接属性

要配置连接器，请执行以下操作：

1. 在连接中单击创建连接。

2. 选择 PostgreSQL 目标连接器，然后提供以下设置：

### 数据目标

* 数据网关：当使用数据移动网关时，选择将用于测试与 MySQL 目标的连接的数据网关。这应该是用于访问数据源的同一网关。

  信息注释

  * 此字段不适用于 Qlik Talend Cloud Starter 订阅，因为此订阅层不支持 数据移动网关。

  * 您还需要在 数据移动网关 计算机上安装相应的驱动程序。有关详细信息，请参阅下文的[驱动程序设置](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/postgresql-target.htm#Driver)。

* 云提供者：根据需要选择以下项之一：

  * 无 - 使用时选择：

    * 内部 PostgreSQL
    * Amazon Aurora
    * Azure Database for PostgreSQL - Flexible Server
    * 无 数据移动网关

  * Amazon RDS

    对于 Amazon RDS for PostgreSQL。

  * Google Cloud - 使用时选择：

    * Google Cloud SQL for PostgreSQL
    * Google Cloud AlloyDB for PostgreSQL

  * Microsoft Azure

    对于 Microsoft Azure Database for PostgreSQL。

* 主机：安装 PostgreSQL 数据库的计算机的主机名或 IP 地址。

* 端口：连接到数据库时要使用的端口。默认值为 5432。

### 帐户属性

用户名称和密码：经授权可访问 PostgreSQL Server 数据库的用户的用户名和密码。

### 数据库属性

* 数据库名称：有两种方法可以用于指定数据库：

  * 方法 1 - 从列表中选择：单击加载数据库，然后选择一个数据库。
  * 方法 2 - 手动：选择手动输入数据库名称，然后输入数据库名称。

* SSL 模式：选择以下其中一项：

  * 禁用 - 仅使用姓氏和密码连接。
  * 允许 - 如果服务器请求，则建立加密连接。
  * 优选 - 这是默认设置。Preferred - 如果服务器支持加密连接，则建立加密连接，如果无法建立加密连接则返回到未加密连接。
  * Required - 如果服务器支持加密连接，则建立加密连接。如果无法建立加密连接，则连接尝试失败。
  * Verify CA - 类似于 Required，但也根据配置的 CA 证书验证服务器证书机构 (CA) 证书。如果找不到有效的匹配 CA 证书，则连接尝试失败。
  * Verify Full - 类似于 Verify CA，但也通过对比服务器发送到客户端的证书中的身份，检查客户端用来连接到服务器的主机名（即 Qlik Talend Data Integration）。客户端检查用于连接的主机名是否与服务器证书中的“公用名”值匹配。如果不匹配，连接将失败。

* 可信证书：颁发 PEM 格式客户端证书文件的证书机构 (CA)。

* 客户端证书：上传服务器请求的客户端证书。

* 客户端证书密钥：PEM 格式的客户端私钥文件。

* CRL：CRL 证书。此文件包含证书颁发机构吊销的证书。如果服务器证书出现在此列表中，则连接将失败。

* SSL 压缩：选择此选项可在数据加密之前对其进行压缩。

* 最大文件大小 (KB)：在将 CSV 文件加载到 PostgreSQL 目标数据库之前，选择或键入其最大大小（以 KB 为单位）。默认值为 32000 KB。

### 内部属性

内部属性用于特殊用例，因此不会在对话框中公开。只有在 Qlik 支持部门的指示下，您才应该使用它们。

使用字段右侧的 the 新建 icon 和 the 取消 icon 按钮可以根据需要添加或删除特性。

### 名称

连接的显示名称。

## 先决条件

### 所需的权限

连接器设置中指定的用户必须是 PostgreSQL 数据库中的注册用户。

此外，还必须授予以下权限：

* 可以登录

* 创建数据库

  信息注释如果目标架构已存在于数据库中，则不需要“创建数据库”权限。

### 驱动程序设置

您可以使用驱动程序安装实用程序（推荐）安装 driver 或手动安装。只有在您遇到驱动程序安装实用程序发生问题的少见情况下，才应尝试手动安装。

#### 使用驱动程序安装实用程序安装驱动程序

本部分介绍如何安装所需的 driver。这个过程包括运行一个脚本，该脚本将自动下载、安装和配置所需的 driver。您还可以根据需要运行脚本来更新和卸载 driver。

准备安装

* 请确保在 数据移动 网关服务器上安装了 Python 3.6 或更高版本。

  Python 预装在大多数 Linux 发行版上。您可以通过运行以下命令来检查系统上安装了哪个 Python 版本。

  python3 --version

安装 driver

下载并安装 driver ：

1. 在 数据移动 网关计算机上，将工作目录更改为：

   opt/qlik/gateway/movement/drivers/bin

2. 然后运行以下命令：

   语法：

   ./install postgres

   如果无法下载 driver（由于访问限制或技术问题），将显示一条消息，为您指示在 数据移动 网关机器上下载 driver 的位置和复制驱动程序的位置。完成此操作后，请再次运行 install postgres 命令。

   否则，将显示 driver 的 EULA。

3. 执行以下选项之一：

   * 重复按 [Enter] 可在 EULA 中缓慢滚动。
   * 重复按空格键可快速滚动 EULA。
   * 按 q 退出许可证文本并显示 EULA 接受选项。

4. 执行以下选项之一：

   * 键入 "y" 并按 [Enter] 接受 EULA 并开始安装。

   * 键入 "n" 并按 [Enter] 拒绝 EULA 并退出安装。

   * 键入“v”并按 [Enter] 以再次查看 EULA。

   将会安装 driver。

更新 driver

如果要在安装提供的 driver 之前卸载以前版本的 driver，请运行 update 命令。

下载并更新 driver：

1. 在 数据移动 网关计算机上，将工作目录更改为：

   opt/qlik/gateway/movement/drivers/bin

2. 然后运行以下命令：

   语法：

   ./update postgres

   如果无法下载 driver（由于访问限制或技术问题），将显示一条消息，为您指示在 数据移动 网关机器上下载 driver 的位置和复制驱动程序的位置。完成此操作后，请再次运行 update postgres 命令。

   否则，将显示 driver 的 EULA。

3. 执行以下选项之一：

   * 重复按 [Enter] 可在 EULA 中缓慢滚动。
   * 重复按空格键可快速滚动 EULA。
   * 按 q 退出许可证文本并显示 EULA 接受选项。

4. 执行以下选项之一：

   * 键入 "y" 并按 [Enter] 接受 EULA 并开始安装。
   * 键入 "n" 并按 [Enter] 拒绝 EULA 并退出安装。
   * 键入“v”并按 [Enter] 可从头开始查看 EULA。

   将卸载旧的 driver，并安装新的 driver。

卸载 driver

如果要卸载 driver，请运行 uninstall 命令。

卸载 driver：

1. 停止所有配置为使用此连接器的任务。

2. 在 数据移动 网关计算机上，将工作目录更改为：

   opt/qlik/gateway/movement/drivers/bin

3. 然后运行以下命令：

   语法：

   ./uninstall postgres

   将卸载 driver。

#### 手动安装驱动程序和库

只有在自动驱动程序安装未成功完成的情况下，才应尝试手动安装 driver。

安装 数据移动网关 后，下载以下 RPM 文件。您可以在 /opt/qlik/gateway/movement/drivers/manifests/postgres.yaml 中找到 binary-artifacts 下文件的直接下载链接。下载完成后，将文件复制到 数据移动网关 机器上。

在 Red Hat 9.x 上安装 数据移动网关 时：

* postgresql&lt;version&gt;-libs-&lt;version&gt;PGDG.rhel9.x86\_64.rpm
* postgresql&lt;version&gt;-&lt;version&gt;PGDG.rhel9.x86\_64.rpm
* postgresql&lt;version&gt;-odbc-&lt;version&gt;PGDG.rhel9.x86\_64.

在 Red Hat 8.x 上安装 数据移动网关 时：

* postgresql&lt;version&gt;-libs-&lt;version&gt;PGDG.rhel8.x86\_64.rpm
* postgresql&lt;version&gt;-&lt;version&gt;PGDG.rhel8.x86\_64.rpm
* postgresql&lt;version&gt;-odbc-&lt;version&gt;PGDG.rhel8.x86\_64.rpm

在 数据移动网关 服务器上，打开 shell 提示符并执行以下操作：

1. 停止 数据移动网关 服务：

   sudo systemctl stop repagent

2. 可选择确认服务已停止：

   sudo systemctl status repagent

   状态应如下所示：

   Active: inactive (dead) since &lt;timestamp&gt; ago

3. 安装 RPM 文件。

4. 将工作目录更改为 &lt;数据移动网关\_Install\_Dir&gt;/bin.

5. 如下将驱动程序位置复制到 `site_arep_login.sh` 文件：

   `echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/lib:/usr/lib64:/usr/pgsql-<version>/lib" >> site_arep_login.sh`

   这将把驱动程序添加到 "LD\_LIBRARY\_PATH" 并更新 site\_arep\_login.sh 文件中的驱动程序位置。

6. 可选择确认已将驱动程序位置复制：

   ```
   cat site_arep_login.sh
                           
   ```

7. 确保 `/etc/odbcinst.ini` 文件包含 PostgreSQL 的条目，如以下示例所示：

   `[PostgreSQL]`

   `Description = PostgreSQL ODBC driver`

   `Driver = /usr/pgsql-13/lib/psqlodbc.so`

   `Setup = /usr/pgsql-13/lib/psqlodbcw.so`

   `UsageCount = 1`

8. 启动 数据移动网关 服务：

   sudo systemctl start repagent

9. 可选择确认服务已启动：

   sudo systemctl status repagent

   状态应如下所示：

   Active: active (running) since &lt;timestamp&gt; ago

## 限制和考虑事项

当使用 PostgreSQL 作为复制目标时，以下限制适用：

* 不支持对没有包含重复记录的主键/唯一索引的表执行 UPDATE 和 DELETE 操作。对这些表的任何更改都将影响目标中的所有记录。
* 在批处理优化应用模式下，不支持键中包含 LOB 列的表。当 VARBINARY 列用作源表键时，将在目标中创建 BYTEA 列。这会导致“批量优化应用”模式中出现不可预测的行为。作为一种变通方法，我们建议使用 SQLite HEX 函数将 VARBINARY 转换为 VARCHAR。

## 数据类型

本机数据类型信息将被保留，并显示在数据集视图的本机数据类型列中。如果列不可见，则需要打开数据集视图的列选择器，然后选择本机数据类型列。

警告注释当源表中的 移动 及列映射到 PostgreSQL 目标上的 BYTEA 时，请确保在[任务设置](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/Replicating/replicating-settings.htm#LOB)中启用了复制 LOB 列选项（默认设置）。

数据类型

| Qlik Cloud 数据类型 | PostgreSQL 数据类型 |
| --- | --- |
| BOOL | BOOL |
| BYTES | BYTEA |
| DATE | DATE |
| TIME | TIME |
| DATETIME | 如果刻度 =&gt; 0 且 =&lt; 6，那么：<br><br>TIMESTAMP<br><br>如果刻度 =&gt; 7 且 =&lt; 12，那么：<br><br>VARCHAR (37) |
| INT1 | SMALLINT |
| INT2 | SMALLINT |
| INT4 | INTEGER |
| INT8 | BIGINT |
| NUMERIC | DECIMAL (p,s) |
| REAL4 | FLOAT4 |
| REAL8 | FLOAT8 |
| STRING | 如果长度为 1 - 21845，则为：<br><br>VARCHAR（以字节为单位的长度 = STRING 值乘以三）<br><br>如果长度为 21846 - 2147483647，则为：<br><br>varchar(65535) |
| UINT1 | SMALLINT |
| UINT2 | INTEGER |
| UINT4 | BIGINT |
| UINT8 | BIGINT |
| WSTRING | 如果长度为 1 - 21845，则为：<br><br>VARCHAR（以字节为单位的长度 = WSTRING 值乘以三）<br><br>如果长度为 21846 - 2147483647，则为：<br><br>varchar(65535) |
| BLOB | BYTEA |
| NCLOB | TEXT |
| CLOB | TEXT |

### 从 PostgreSQL 源复制时的数据类型

从 PostgreSQL 源复制时，除了具有用户定义或 PostGIS 数据类型的列外，将为所有列创建具有相同数据类型的目标表。在这种情况下，数据类型将在目标中创建为“变化字符”。