1

我正在尝试启动一个 Postgres 客户端并保留它,以便我可以向它发送几个 SQL 命令并收集每个命令的结果。我当前的问题是第一组命令似乎没有发送到进程,除非我关闭文件句柄以发送命令。但是关闭文件句柄会破坏程序的全部目的。

这是代码:

my ($child_read, $child_write);
our $pid = open2($child_read, $child_write, '../psql -p 2070 super');
print STDOUT $pid . "\n";
$child_write->autoflush(1);

my $output1;
my $theCommands = "set schema 'super'; \n select count(*) from MyTable;";
print $child_write $theCommands;
close($child_write);

print "About to try and get query results. \n";
while (<$child_read>)
{
    print "$_";
}

上面的代码有效。我得到了查询的结果,但我可以让 SQL 命令执行的唯一方法是关闭 $child_write 文件句柄。如果我不关闭它,那么程序在尝试读取行时会挂起。

如何在不关闭 $child_write 文件句柄的情况下将 SQL 命令发送到 Postgres 客户端?

这是寻找从 Perl 向 Postgres 发送查询的帮助的后续问题。

4

1 回答 1

2

你确保你刷新了你的输出,但你没有确保你psql做了同样的事情。您可能可以通过使用伪 tty 将其欺骗为刷新。如果您想继续自动, Expect可能是要走的路psql

更简单、更健壮的方法是使用DBI

于 2012-10-16T01:35:49.553 回答