使用QProcess启动时,pg_dumpall无法正常工作

时间:2016-06-17 12:57:02

标签: postgresql qt dump qprocess

我想将我的数据和表从一个postgres安装复制到另一个,源版本侦听端口5433上的端口5432目标服务器。用户myUser在两个版本上都是超级用户。

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");

2 个答案:

答案 0 :(得分:0)

是的,它有点烦人,我试图用ls | grep <pattern>类型命令做同样的事情 - 产生多个进程......

我为linux想出了这个:

if (QProcess::startDetached("xfce4-terminal -x bash -c \"ls -l | grep main > out\""))
{
    qDebug("ok\n");
}
else
{
    qDebug("failed\n");
}

所以基本上如果我打破了它:

  1. QProcess使用execute参数-x运行xfce4-terminal(或任何你想要的术语): xfce4-terminal -x <command to execute>

  2. 然后使用命令参数-c(在转义引号中)执行bash: bash -c \"bash command\"

  3. 最后是bash命令: ls -l | grep main > out

  4. 因此,对于您的应用程序,您可以使用以下命令替换最终命令(第3部分): pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433

    我假设您使用的是Linux? (对于使用cmd而不是终端的窗口,也有类似的可能性。另外,您可能只需将xfce4-terminal替换为gnome-terminal,这可能更常见,但可能需要检查-x是一样的...... IIRC就是这样。

    可能有一种更好的方法可以做到这一点....但我想利用bash的力量,所以这似乎是合乎逻辑的做法。

    此外:我认为你可以这样做:

    QProcess::startDetached("bash -c \"ls -l | grep main > out\"")
    

    摆脱终端部分,(适用于简单的东西,如ls),但我不确定是否所有的路径和什么都没有设置...值得一试,因为它有点整洁并删除你的依赖任何特定终端...

答案 1 :(得分:0)

谢谢!是的,管子是问题。

在Windows中,这对我有用:

QProcess * startProgram = new QProcess();

startProgram-&gt; start(“cmd / c \”pg_dumpall -p 5432 -U myUser | psql -U myUser -d myDbName -p 5433 \“”);