gpt4 book ai didi

postgresql - 通过 Lazarus Pascal 恢复 Postgres 不起作用

转载 作者:行者123 更新时间:2023-11-29 13:31:01 26 4
gpt4 key购买 nike

我正在 Ubuntu 12.04 上使用 Lazarus Pascal + Postgres 构建应用程序。

下面的代码行在终端上运行良好:

/usr/bin/psql --host localhost --port 5432 --username "postgres" --quiet "dbHRS" < "t2"

但是,它似乎没有在我的 Pascal 程序中运行。

恢复行存储在这样的文本文件中:

/usr/bin/psql
--host localhost --port 5432 --username "postgres" --quiet "dbHRS" < "%s"

我的 Pascal 代码采用这两行并将 %s 替换为实际文件名并像这样运行它:

    AssignFile(RPath, 'restore.inf'); //Name of text file
Reset(RPath);
xx:= 0; //just a dummy value. If it changes due to an error, it's easy to know

Readln(RPath, FileString);
ExecProgram:= FileString;

Readln(RPath, FileString);
ExecParams:= Format(FileString, [txtOpenName.Text]);

CloseFile(RPath);
ShowMessage('"' + ExecProgram + '"'); //shows correctly
ShowMessage('"' + ExecParams + '"'); //shows correctly
try
ExecStatus := SysUtils.ExecuteProcess(UTF8ToSys(ExecProgram), ExecParams, []);

Except
on EOSError do xx:= ExecStatus; //This never occurs
end;

ExecStatus 为 0 而 xx 仍为 5。所以我假设没有错误。

有什么问题吗?为什么数据没有返回到数据库中?表是空的,这意味着恢复没有发生。

顺便说一句,我也有一个类似方式的备份脚本,它工作正常。数据是正确的。这就是我创建备份文件的方式。

任何助手对此都非常看重。谢谢!

附加信息:我可以使用 ExecuteProcess 运行以下命令:

/usr/bin/pg_dump

--host localhost --port 5432 --username "postgres" --role "mizk" --no-password --format plain --data-only --inserts --column-inserts --verbose --file "abc" "dbHRS"

上面两行表示使用的ExecProgram和ExecParams。所以这就是为什么我对手头的问题感到困惑。

最佳答案

Executeprocess 使用 execve(2) 执行,因此只运行一个程序 + 参数,而不是带重定向的完整 shell。

因此管道输入结构将无法工作,并且可能引用也是错误的。 (因为这些引号不会被剥离并将被传递给接收程序)。

对于特定于 unix 的 shell 使用,请使用 unix.fpsystem(),它与 ​​system(3) 类似。

或者,你可以做类似的事情

    s:=ExecProgram+' ' +ExecParams;
ExecStatus:=Executeprocess ('/bin/sh',['-c',s]);

自从我编写 executeprocess 以来已经有一段时间了(2004-2005?),但据我所知,它不会引发异常作为正常使用的一部分。

关于postgresql - 通过 Lazarus Pascal 恢复 Postgres 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23189319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com