2025年9月25日: PostgreSQL 18 发布!
支持版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

32.2. 连接状态函数 #

这些函数可用于查询现有数据库连接对象的状态。

提示

libpq 应用程序开发者应该小心维护 PGconn 抽象。使用下面描述的访问器函数来获取 PGconn 的内容。不推荐使用 libpq-int.h 来引用内部 PGconn 字段,因为它们将来可能会被更改。

以下函数返回在连接时建立的参数值。这些值在连接的生命周期内是固定的。如果使用了多主机连接字符串,PQhostPQportPQpass 的值可能会在使用相同的 PGconn 对象建立新连接时发生更改。其他值在 PGconn 对象的生命周期内是固定的。

PQdb #

返回连接的数据库名称。

char *PQdb(const PGconn *conn);
PQuser #

返回连接的用户名称。

char *PQuser(const PGconn *conn);
PQpass #

返回连接的密码。

char *PQpass(const PGconn *conn);

PQpass 将返回在连接参数中指定的密码,或者如果没有指定密码且密码是从 密码文件 获取的,它将返回该密码。在后一种情况下,如果连接参数中指定了多个主机,则在连接建立之前无法依赖 PQpass 的结果。可以使用 PQstatus 函数检查连接状态。

PQhost #

返回活动连接的服务器主机名。这可以是主机名、IP 地址,或者如果连接是通过 Unix 套接字,则为目录路径。(路径情况可以通过它总是以 / 开头的绝对路径来区分。)

char *PQhost(const PGconn *conn);

如果连接参数同时指定了 hosthostaddr,则 PQhost 将返回 host 信息。如果仅指定了 hostaddr,则返回该地址。如果连接参数中指定了多个主机,PQhost 返回实际连接到的主机。

PQhost 如果 conn 参数为 NULL,则返回 NULL。否则,如果在生成主机信息时发生错误(可能因为连接尚未完全建立或发生错误),它将返回一个空字符串。

如果连接参数中指定了多个主机,则在连接建立之前无法依赖 PQhost 的结果。可以使用 PQstatus 函数检查连接状态。

PQhostaddr #

返回活动连接的服务器 IP 地址。这可以是主机名解析到的地址,或者通过 hostaddr 参数提供的 IP 地址。

char *PQhostaddr(const PGconn *conn);

PQhostaddr 如果 conn 参数为 NULL,则返回 NULL。否则,如果在生成主机信息时发生错误(可能因为连接尚未完全建立或发生错误),它将返回一个空字符串。

PQport #

返回活动连接的端口。

char *PQport(const PGconn *conn);

如果连接参数中指定了多个端口,PQport 返回实际连接到的端口。

PQport 如果 conn 参数为 NULL,则返回 NULL。否则,如果在生成端口信息时发生错误(可能因为连接尚未完全建立或发生错误),它将返回一个空字符串。

如果连接参数中指定了多个端口,则在连接建立之前无法依赖 PQport 的结果。可以使用 PQstatus 函数检查连接状态。

PQtty #

此函数不再执行任何操作,但为向后兼容而保留。该函数始终返回一个空字符串,或者如果 conn 参数为 NULL,则返回 NULL

char *PQtty(const PGconn *conn);
PQoptions #

返回在连接请求中传递的命令行选项。

char *PQoptions(const PGconn *conn);

以下函数返回的状态数据,这些数据可能会随着在 PGconn 对象上执行的操作而改变。

PQstatus #

返回连接的状态。

ConnStatusType PQstatus(const PGconn *conn);

状态可以有多个值。但是,只有两个值在异步连接过程之外可见:CONNECTION_OKCONNECTION_BAD。与数据库的良好连接具有 CONNECTION_OK 状态。失败的连接尝试由 CONNECTION_BAD 状态表示。通常,OK 状态将一直保持到调用 PQfinish,但通信故障可能会导致状态过早地更改为 CONNECTION_BAD。在这种情况下,应用程序可以尝试通过调用 PQreset 来恢复。

有关可能返回的其他状态代码,请参阅 PQconnectStartParamsPQconnectStartPQconnectPoll 的条目。

PQtransactionStatus #

返回服务器当前的事务状态。

PGTransactionStatusType PQtransactionStatus(const PGconn *conn);

状态可以是 PQTRANS_IDLE(当前空闲)、PQTRANS_ACTIVE(正在执行命令)、PQTRANS_INTRANS(空闲,在有效的事务块中)或 PQTRANS_INERROR(空闲,在失败的事务块中)。如果连接有问题,则报告 PQTRANS_UNKNOWN。仅当查询已发送到服务器且尚未完成时,才报告 PQTRANS_ACTIVE

PQparameterStatus #

查找服务器的当前参数设置。

const char *PQparameterStatus(const PGconn *conn, const char *paramName);

某些参数值会在连接启动时或其值更改时由服务器自动报告。PQparameterStatus 可用于查询这些设置。如果参数已知,它将返回参数的当前值;如果参数未知,则返回 NULL

当前版本报告的参数包括

application_name scram_iterations
client_encoding search_path
DateStyle server_encoding
default_transaction_read_only server_version
in_hot_standby session_authorization
integer_datetimes standard_conforming_strings
IntervalStyle TimeZone
is_superuser  

(default_transaction_read_onlyin_hot_standby 在 14 版之前不被报告;scram_iterations 在 16 版之前不被报告;search_path 在 18 版之前不被报告。) 请注意,server_versionserver_encodinginteger_datetimes 在启动后不会改变。

如果没有报告 standard_conforming_strings 的值,应用程序可以假定它为 off,即反斜杠在字符串字面量中被视为转义字符。此外,此参数的存在可以被视为指示接受转义字符串语法 (E'...')。

虽然返回的指针被声明为 const,但它实际上指向与 PGconn 结构关联的可变存储。不应假定指针在查询之间保持有效。

PQfullProtocolVersion #

查询正在使用的客户端/后端协议。

int PQfullProtocolVersion(const PGconn *conn);

应用程序可能希望使用此函数来确定是否支持某些功能。结果是通过将服务器的主版本号乘以 10000 并加上次版本号形成的。例如,版本 3.2 将返回 30002,版本 4.0 将返回 40000。如果连接有问题,则返回零。3.0 协议由 PostgreSQL 服务器版本 7.4 及以上版本支持。

协议版本在连接启动完成后不会改变,但理论上在连接重置期间可能会改变。

PQprotocolVersion #

查询客户端/后端协议的主版本。

int PQprotocolVersion(const PGconn *conn);

PQfullProtocolVersion 不同,此函数仅返回正在使用的主要协议版本,但它得到更广泛的 libpq 版本支持,可以追溯到 7.4 版本。目前,可能的值是 3(3.0 协议)或零(连接有问题)。在 14.0 版本之前,libpq 还可以返回 2(2.0 协议)。

PQserverVersion #

返回一个整数,表示服务器版本。

int PQserverVersion(const PGconn *conn);

应用程序可以使用此函数来确定它们所连接的数据库服务器的版本。结果是通过将服务器的主版本号乘以 10000 并加上次版本号形成的。例如,版本 10.1 将返回 100001,版本 11.0 将返回 110000。如果连接有问题,则返回零。

在主版本 10 之前,PostgreSQL 使用三部分版本号,其中前两部分组合起来表示主版本。对于这些版本,PQserverVersion 为每个部分使用两位数字;例如,版本 9.1.5 将返回 90105,版本 9.2.0 将返回 90200。

因此,为了确定功能兼容性,应用程序应该将 PQserverVersion 的结果除以 100 而不是 10000 来确定逻辑主版本号。在所有发行系列中,只有最后两位数字在次版本(错误修复版本)之间有所不同。

PQerrorMessage #

返回由连接操作最近生成的错误消息。

char *PQerrorMessage(const PGconn *conn);

几乎所有 libpq 函数在失败时都会为 PQerrorMessage 设置消息。请注意,根据 libpq 的约定,非空 PQerrorMessage 结果可能包含多行,并且会包含一个尾随的换行符。调用者不应直接释放结果。它将在关联的 PGconn 句柄传递给 PQfinish 时被释放。在 PGconn 结构上的操作之间,不应期望结果字符串保持不变。

PQsocket #

获取与服务器的连接套接字的文件描述符编号。有效描述符将大于或等于 0;-1 的结果表示当前没有打开服务器连接。(这在正常操作过程中不会改变,但在连接设置或重置期间可能会改变。)

int PQsocket(const PGconn *conn);
PQbackendPID #

返回处理此连接的后端进程的ID(PID)

int PQbackendPID(const PGconn *conn);

后端PIDPID 有助于调试,并且可以与 NOTIFY 消息进行比较(NOTIFY 消息包含通知后端进程的PIDPID)。请注意,PIDPID 属于在数据库服务器主机上执行的进程,而不是本地主机!

PQconnectionNeedsPassword #

如果连接的认证方法需要密码但没有可用密码,则返回 true (1)。否则返回 false (0)。

int PQconnectionNeedsPassword(const PGconn *conn);

此函数可以在连接尝试失败后应用,以决定是否提示用户输入密码。

PQconnectionUsedPassword #

如果连接的认证方法使用了密码,则返回 true (1)。否则返回 false (0)。

int PQconnectionUsedPassword(const PGconn *conn);

此函数可以在连接尝试失败或成功后应用,以检测服务器是否要求提供密码。

PQconnectionUsedGSSAPI #

如果连接的认证方法使用了 GSSAPI,则返回 true (1)。否则返回 false (0)。

int PQconnectionUsedGSSAPI(const PGconn *conn);

此函数可用于检测连接是否已通过 GSSAPI 进行身份验证。

以下函数返回与 SSL 相关的信息。这些信息通常在连接建立后不会改变。

PQsslInUse #

如果连接使用 SSL,则返回 true (1);否则返回 false (0)。

int PQsslInUse(const PGconn *conn);
PQsslAttribute #

返回与 SSL 相关的连接信息。

const char *PQsslAttribute(const PGconn *conn, const char *attribute_name);

可用属性列表因使用的 SSL 库和连接类型而异。如果连接不使用 SSL 或指定的属性名称在所使用的库中未定义,则返回 NULL。

常用的属性包括

library

正在使用的 SSL 实现的名称。(目前仅实现了 "OpenSSL"

protocol

正在使用的 SSL/TLS 版本。常见值为 "TLSv1""TLSv1.1""TLSv1.2",但如果使用了其他协议,实现可能会返回其他字符串。

key_bits

加密算法使用的密钥位数。

cipher

使用的密码套件的简短名称,例如 "DHE-RSA-DES-CBC3-SHA"。名称特定于每个 SSL 实现。

compression

如果使用 SSL 压缩,则返回 "on",否则返回 "off"。

alpn

TLS 应用层协议协商 (ALPN) 扩展选择的应用协议。libpq 支持的唯一协议是 postgresql,因此这主要用于检查服务器是否支持 ALPN。如果未使用 ALPN,则为空字符串。

特殊情况下,可以通过将 NULL 作为 conn 参数传递来在没有连接的情况下查询 library 属性。结果将是默认 SSL 库的名称,或者如果 libpq 未使用任何 SSL 支持进行编译,则为 NULL。(在 PostgreSQL 版本 15 之前,将 NULL 作为 conn 参数传递始终导致 NULL。需要区分此情况的新旧实现的客户端程序可以检查 LIBPQ_HAS_SSL_LIBRARY_DETECTION 功能宏。)

PQsslAttributeNames #

返回一个 SSL 属性名称数组,这些名称可用于 PQsslAttribute()。数组以 NULL 指针终止。

const char * const * PQsslAttributeNames(const PGconn *conn);

如果 conn 为 NULL,则返回默认 SSL 库的可用属性;如果 libpq 未使用任何 SSL 支持进行编译,则返回空列表。如果 conn 不为 NULL,则返回连接所使用的 SSL 库的可用属性;如果连接未加密,则返回空列表。

PQsslStruct #

返回一个指向 SSL 实现特定对象(描述连接)的指针。如果连接未加密或所请求的对象类型无法从连接的 SSL 实现中获得,则返回 NULL。

void *PQsslStruct(const PGconn *conn, const char *struct_name);

可用结构取决于所使用的 SSL 实现。对于 OpenSSL,有一个结构,可用名称为 OpenSSL,它返回指向 OpenSSLSSL 结构的指针。要使用此函数,可以使用类似以下的代码:

#include <libpq-fe.h>
#include <openssl/ssl.h>

...

    SSL *ssl;

    dbconn = PQconnectdb(...);
    ...

    ssl = PQsslStruct(dbconn, "OpenSSL");
    if (ssl)
    {
        /* use OpenSSL functions to access ssl */
    }

此结构可用于验证加密级别、检查服务器证书等。有关此结构的信息,请参阅 OpenSSL 文档。

PQgetssl #

返回连接中使用的 SSL 结构,如果未使用 SSL,则返回 NULL。

void *PQgetssl(const PGconn *conn);

此函数等同于 PQsslStruct(conn, "OpenSSL")。不应在新应用程序中使用,因为返回的结构特定于 OpenSSL,如果使用了其他SSL实现,则不可用。要检查连接是否使用 SSL,请改用 PQsslInUse,有关连接的更多详细信息,请使用 PQsslAttribute

提交更正

如果您在文档中发现任何不正确之处、与您在使用特定功能时的经验不符之处或需要进一步澄清之处,请使用 此表单 报告文档问题。