我想将我的数据和表从一个 postgres 安装复制到另一个,源版本在端口 5432 上监听目标服务器的端口 5433。用户 myUser 是两个版本的 super 用户。
Postgres“pg_dumpall”在使用 QProcess 启动时不工作 但是该命令在 Windows cmd 中有效,这里是:
pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433
但不是来自使用 QProcess 的 Qt 代码:
QProcess *startProgram = new QProcess();
startProgram->start("pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433");
startProgram->waitForFinished()
return true
startProgram->exitCode();
returns 1
startProgram->exitStatus();
return 0
无论如何,我的数据和表格都没有复制到目的地。 使用 QProcess 创建数据库的方法是:
startProgram->start("createdb -p 5433 -U myUser myDbName");
最佳答案
是的,这有点烦人,我试图用 ls | grep <pattern>
做同样的事情输入命令 - 产生多个进程...
我为 linux 想出了这个:
if (QProcess::startDetached("xfce4-terminal -x bash -c \"ls -l | grep main > out\""))
{
qDebug("ok\n");
}
else
{
qDebug("failed\n");
}
所以基本上,如果我将其分解:
QProcess 使用执行参数 -x 运行 xfce4-terminal(或您想要的任何术语):
xfce4-terminal -x <command to execute>
然后使用命令参数 -c(在转义引号中)执行 bash:
bash -c \"bash command\"
最后是 bash 命令:
ls -l | grep main > out
因此对于您的应用程序,您可以将最终命令(第 3 部分)替换为:
pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433
我假设您使用的是 Linux? (对于使用 cmd
而不是终端的 Windows 也有类似的可能性。您也可以将 xfce4-terminal
替换为 gnome-terminal
这可能更常见,但可能需要检查 -x 是否相同... .IIRC 是。
可能有更好的方法来做到这一点......但我想利用 bash 的力量,所以这似乎是合乎逻辑的方法。
进一步:我认为你可以这样做:
QProcess::startDetached("bash -c \"ls -l | grep main > out\"")
并摆脱终端部分,(适用于简单的东西,如 ls),但我不确定是否设置了所有路径和其他东西......值得一试,因为它更整洁并删除了你的对任何特定终端的依赖...
关于postgresql - 使用 QProcess 启动时 pg_dumpall 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37882156/