我正在尝试通过 PHP 运行 PostgreSQL 脚本时处理 SQL 错误。 即使我强制 SQL 脚本失败,我的 exec() 调用也始终返回状态“0”:
PHP:
[...]
$command = "$psqlPath -h $myHost -d $myDb -U $myUser -f $sqlScript 2>&1";
$output = [];
$return_var = 0;
exec($command, $output, $return_var);
sqlScript
旨在导致违反约束。结果是:
$return_var -> 0
$output[0] -> "psql:/pathToMyScript/sqlScript.sql:1: ERROR: duplicate key value violates unique constraint"
我做错了什么?为什么 return_var 仍然是“0”?
如果担心:我正在运行相对较旧的 PostgreSQL 版本:10.17。
PHP 仅传输命令生成的退出代码,并且
pgsql
默认情况下不会返回违反约束的非零值:
bash-5.1# psql -U docker -f test.sql; echo $?
psql:test.sql:1: ERROR: null value in column "iso_code" of relation "country" violates not-null constraint
DETAIL: Failing row contains (1, null, null, blah, null, null, null).
0
如记录:
退出状态
psql 如果正常完成则向 shell 返回 0,如果致命则返回 1 发生自身错误(例如,内存不足、未找到文件),如果为 2 与服务器的连接出现故障并且会话不正常 交互式,如果脚本和变量中发生错误则为 3 ON_ERROR_STOP 已设置。
在您的情况下,您可以提供它作为参数:
bash-5.1# psql -U docker -f test.sql -v ON_ERROR_STOP=1; echo $?
psql:test.sql:1: ERROR: null value in column "iso_code" of relation "country" violates not-null constraint
DETAIL: Failing row contains (1, null, null, blue, null, null, null).
3