2012-10-16 3 views
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 파일 핸들을 닫지 않고 Postgres 클라이언트로 SQL 명령을 보내려면 어떻게해야합니까?

여기에 대한 질문은 Looking for help to send queries to Postgres from Perl입니다.

+1

프로세스와 파이프를 망칠 필요없이 postgres 드라이버를 사용할 수 있습니까? http://search.cpan.org/~turnstep/DBD-Pg-2.19.3/Pg.pm –

+0

기타 : http://www.techrepublic.com/article/retrieve-data-from-a- postgresql-database -using-the-perl-dbi/6039937 –

+1

링크가 수정되었으므로 DBI와 DBD :: Pg가 이미 추천되었습니다. 이 사용 사례의 경우 실제로 추천 할 것입니다. IPC 사용을 계속 선택하면 비 차단 읽기가 더 도움이됩니다. 아마도 IO :: Select를 사용할 수 있습니다. 자세한 내용은이 토론 스레드를 참조하십시오. http://www.velocityreviews.com/forums/t887094-nonblocking-pipe-open.html –

답변

2

출력을 플러시했는지 확인했지만 psql이 동일한 작업을 수행했는지 확인하지 않았습니다. 의사 용 tty를 사용하여이를 속일 수 있습니다. Expect은 아마도 자동으로 계속하려면 psql으로 가고 싶을 것입니다.

더 간단하고 강력한 방법은 DBI을 사용하는 것입니다.

+0

설명해 주셔서 감사합니다. 말된다. Open2에 대한 온라인 문서를 계속 검토하고 결과물을 플러시 할 수있는 방법이 있는지 알아 내려고 노력했습니다. 나는 내 편에서의 플러시와 psql 측에서의 플러싱의 차이에 초점을 맞추지 않았다. 나는 Expect를 점검 할 것이다. – Henry

관련 문제