我想将我的数据和表从一个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");
答案 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");
}
所以基本上如果我打破了它:
QProcess使用execute参数-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
而不是终端的窗口,也有类似的可能性。另外,您可能只需将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 \“”);