如何在Shell中为Unix域套接字连接指定正确的libpq连接字符串URL
解决libpq连接字符串问题
问题背景
已编译libpq示例程序:
gcc test.c -L/usr/local/pgsql15/lib -I/usr/local/pgsql15/include -lpq
尝试多个连接字符串均失败,报错始终指向默认Unix套接字/tmp/.s.PGSQL.5432,提示文件不存在。数据库实例的postgresql.conf相关配置如下:
unix_socket_directories = '/tmp' # comma-separated list of directories #unix_socket_group = '' # (change requires restart) unix_socket_permissions = 0777 # begin with 0 to use octal notation
之前尝试的错误连接字符串:
./a.out postgresql:///test15?host=/tmp&port=5415./a.out postgresql://test15?host=/tmp:5415./a.out postgresql://test15?host=/tmp&port='5415'./a.out postgresql://test15?host=/tmp:'5415'./a.out postgresql://test15?host=/tmp&port=/tmp./a.out postgresql:///tmp:5415/test15?
正确的连接字符串
以下两种格式均可成功连接:
1. URL格式(推荐)
./a.out "postgresql:///test15?host=/tmp&port=5415"
注意:必须用引号包裹参数,避免shell将&解析为后台执行符号,导致端口参数丢失。
2. 键值对格式
./a.out "host=/tmp port=5415 dbname=test15"
失败原因分析
- 部分格式混淆了Unix套接字路径与端口的写法,将两者拼接在一起(如
host=/tmp:5415),libpq无法正确解析 - 给端口添加单引号会导致libpq将引号视为端口号的一部分,解析失败
- 未用引号包裹参数时,
&被shell截断,程序仅收到host=/tmp部分,默认使用5432端口,与实际数据库端口不匹配 - 错误地将Unix套接字路径放在URL的主机位置(如
postgresql:///tmp:5415/test15?),套接字路径需通过host参数指定,不能直接替换URL中的主机字段
内容的提问来源于stack exchange,提问作者jian
相关产品推荐
相关产品推荐

