SuperAPI AI 工具集

postgresql

编程与开发

查看项目

更新于 10-15 08:50

技能介绍

该技能为 PostgreSQL 开发提供综合辅助,内容依据官方文档生成。

用途与触发场景:在处理 PostgreSQL 相关工作时使用;当询问 PostgreSQL 特性或 API、实现 PostgreSQL 解决方案、调试 PostgreSQL 代码、学习 PostgreSQL 最佳实践时,均可触发该技能。描述中明确提到其覆盖范围包括 SQL 查询、数据库设计、数据库管理、性能调优以及高级特性。

主要能力:提供快速参考与常见模式。资料中给出的示例主题为 libpq 的连接控制函数,涉及数据库连接控制函数的用法,包括连接字符串与参数关键字。

使用方式(以资料中的连接控制为例):

  • 连接由 PGconn 对象表示,可通过 PQconnectdb、PQconnectdbParams 或 PQsetdbLogin 获得。这些函数通常返回非空对象指针(除非内存不足以分配 PGconn)。在通过连接对象发送查询之前,应调用 PQstatus 检查连接是否成功。
  • PQconnectdbParams:使用两个以 NULL 结尾的数组(keywords 与 values)打开新数据库连接。参数集可在不改变函数签名的前提下扩展,因此推荐用于新程序;也可使用其非阻塞版本 PQconnectStartParams 与 PQconnectPoll。数组可为空以使用全部默认参数。处理在 keywords 数组第一个 NULL 处停止;与某个非 NULL 关键字对应的 values 值为 NULL 或空字符串时,忽略该条目并继续处理下一对。当 expand_dbname 非零时,第一个 dbname 的值会被检查是否为连接字符串,若是则展开为各个连接参数;仅第一个 dbname 如此处理。参数数组按从头到尾处理,重复关键字取最后一个非 NULL 非空值。处理完数组与展开的连接字符串后,未设置的参数使用环境变量值,若环境变量也未设置则使用内置默认值。
  • PQconnectdb:使用字符串 conninfo 中的参数打开新数据库连接。字符串可为空以使用全部默认参数,也可包含以空白分隔的一个或多个参数设置,或包含一个 URI。
  • PQsetdbLogin:PQconnectdb 的前身,使用固定参数集。缺少的参数始终取默认值;未使用的参数可传 NULL 或空字符串。若 dbName 含有等号或具有有效连接 URI 前缀,则视为 conninfo 字符串,其余参数按 PQconnectdbParams 的说明应用。pgtty 已不再使用,传入的任何值都会被忽略。
  • PQsetdb:宏,以空指针调用 PQsetdbLogin 的 login 与 pwd 参数,为兼容旧程序提供。
  • 非阻塞连接:PQconnectStartParams、PQconnectStart、PQconnectPoll 用于在打开连接时不阻塞应用线程执行,等待 I/O 完成可发生在应用主循环中,从而与其他活动并行。使用条件包括:hostaddr 参数须恰当使用以避免 DNS 查询;若调用 PQtrace,需确保追踪写入的流对象不会阻塞;调用 PQconnectPoll 前须确保套接字处于适当状态。开始非阻塞连接请求时调用 PQconnectStart 或 PQconnectStartParams;若返回空,表示 libpq 无法分配新的 PGconn 结构;否则返回有效 PGconn 指针(尚未代表有效数据库连接)。随后调用 PQstatus(conn),若返回 CONNECTION_BAD,连接尝试已失败。之后通过 PQsocket(conn) 获得底层套接字描述符并轮询,注意不要假设该套接字在多次 PQconnectPoll 调用之间保持不变。循环方式:若上次 PQconnectPoll 返回 PGRES_POLLING_READING,等待套接字可读后再次调用;若返回 PGRES_POLLING_WRITING,等待套接字可写后再次调用;首次迭代(尚未调用过 PQconnectPoll)按上次返回 PGRES_POLLING_WRITING 处理。直到返回 PGRES_POLLING_FAILED(失败)或 PGRES_POLLING_OK(连接成功)。PQsocketPoll 可帮助减少 select(2) 或 poll(2) 的样板代码(若系统提供)。连接过程中可通过 PQstatus 检查状态,可能出现的中间状态包括:CONNECTION_STARTED、CONNECTION_MADE、CONNECTION_AWAITING_RESPONSE、CONNECTION_AUTH_OK、CONNECTION_SSL_STARTUP、CONNECTION_GSS_STARTUP、CONNECTION_CHECK_WRITABLE、CONNECTION_CHECK_STANDBY、CONNECTION_CONSUME。应用不应依赖这些常量以特定顺序出现、是否出现或状态总为文档所列值。使用 PQconnectPoll 时连接参数 connect_timeout 会被忽略,由应用自行判断是否超时。PQconnectStart 加 PQconnectPoll 循环等价于 PQconnectdb。当 PQconnectStart 或 PQconnectStartParams 返回非空指针时,完成后必须调用 PQfinish 释放结构与相关内存,即使连接尝试失败或被放弃也必须执行。
  • PQsocketPoll:轮询由 PQsocket 获取的连接底层套接字描述符,主要用于遍历 PQconnectStartParams 文档所述的连接序列。类型定义为 typedef int64_t pg_usec_time_t; 函数原型为 int PQsocketPoll(int sock, int forRead, int forWrite, pg_usec_time_t end_time);。若 forRead 非零,套接字可读时函数终止;若 forWrite 非零,套接字可写时终止。超时由 end_time 指定,表示自 Unix 纪元起的微秒数(即 time_t 乘以 100 万);end_time 为 -1 表示无限超时;为 0(或任何早于当前时间)表示立即超时(不阻塞)。超时值可通过将所需微秒数与 PQgetCurrentTimeUSec 的结果相加方便地计算。底层系统调用精度可能低于微秒,实际延迟可能不精确。返回值:指定条件满足时大于 0,超时返回 0,出错返回 -1,错误可通过 errno(3) 获取。forRead 与 forWrite 同时为零时,函数立即返回超时指示。PQsocketPoll 依平台使用 poll(2) 或 select(2) 实现。
  • PQconndefaults:返回默认连接选项,可用于确定所有可能的 PQconnectdb 选项及其当前默认值。返回指向 PQconninfoOption 结构数组的指针,以关键字指针为空的条目结尾。内存分配失败返回空指针。当前默认值(val 字段)取决于环境变量和其他上下文。缺失或无效的 service 文件会被静默忽略。调用方须将连接选项数据视为只读。处理完选项数组后须传给 PQconninfoFree 释放,否则每次调用会泄漏少量内存。PQconninfoOption 结构字段包括 keyword、envvar、compiled、val、label、dispchar、dispsize;其中 dispchar 指示连接对话框中字段的显示方式:"" 按原样显示输入值,"*" 密码字段隐藏值,"D" 调试选项默认不显示。
  • PQconninfo:返回活动连接所使用的连接选项,可用于确定所有可能的 PQconnectdb 选项以及连接服务器时所用的值。返回结构与结尾规则同上,PQconndefaults 的所有说明同样适用于其结果。
  • PQconninfoParse:从提供的连接字符串返回解析后的连接选项。解析连接字符串并将结果作为数组返回;连接字符串有问题时返回 NULL。可用于提取所提供连接字符串中的 PQconnectdb 选项。返回指向 PQconninfoOption 结构数组的指针,以关键字指针为空的条目结尾。结果数组中会出现所有合法选项,但连接字符串中未出现的选项其 val 为 NULL,不会插入默认值。若 errmsg 非空,成功时 *errmsg 设为 NULL,否则设为解释问题的 malloc 错误字符串;也可能出现 *errmsg 为 NULL 且函数返回 NULL 的情况,表示内存不足。处理完选项数组后须传给 PQconninfoFree 释放,否则会泄漏内存。

安全提示:资料中的警告指出,若不可信用户可访问尚未采用安全 schema 使用模式的数据库,应在每个会话开始时从 search_path 中移除可公开写入的 schema。可将参数关键字 options 设为 -csearch_path=,或在连接后执行 PQexec(conn, "SELECT pg_catalog.set_config('search_path', '', false)")。此注意事项不限于 libpq,适用于执行任意 SQL 命令的每个接口。

限制与注意事项:在 Unix 上,对带有打开 libpq 连接的进程调用 fork 可能导致不可预测的结果,因为父子进程共享同一套接字和操作系统资源,因此不建议这样使用;不过从子进程执行 exec 加载新可执行文件是安全的。

资料还提到多处章节引用(如 32.1.1、32.1.2、32.15 等),但未提供这些章节的完整内容;除此之外,技能的安装方式、收费情况、支持平台等信息暂未提供。