PHP调用bash脚本连接PostgreSQL建库报错原因咨询
报错根本原因
问题出在bash脚本中设置的PGDATABASE环境变量:
psql客户端启动时会默认读取PGDATABASE环境变量的值,作为建立连接时的初始目标数据库。如果命令行没有通过-d参数显式指定要连接的数据库,就会优先尝试连接这个环境变量指向的库。- 你将
PGDATABASE设置为尚未创建的newDBFromBashPHP,无论后续要执行的是查库列表\l、删库还是建库命令,psql都需要先成功连接到初始数据库,才能执行后续传入的SQL语句。连接不存在的库会直接触发FATAL报错,后续逻辑完全不会执行。 - 终端直接执行建库命令能成功,是因为终端环境没有配置这个
PGDATABASE变量,psql会默认连接PostgreSQL预装的、默认存在的postgres系统库,连接成功后自然可以正常执行建库语句。 - 将
PGDATABASE替换为已有库名后脚本能正常运行,也是因为初始连接的库真实存在,psql可以正常建立连接执行后续命令。
修复方案
二选一即可:
- 直接删除脚本中
PGDATABASE=newDBFromBashPHP这行环境变量配置,让psql默认连接已存在的postgres系统库,后续所有维护命令都可正常执行。 - 保留
PGDATABASE变量的前提下,在所有执行查库、删库、建库操作的psql命令中,显式添加-d postgres参数指定连接默认系统库,示例:
# 查库列表命令修改 psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c '\l' # 删库命令修改 psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "DROP DATABASE IF EXISTS \"${PGDATABASE}\";" # 建库命令修改 psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "CREATE DATABASE \"${PGDATABASE}\";"
内容的提问来源于stack exchange,提问作者sysSTD
相关产品推荐
相关产品推荐

