- ベストアンサー
PerlでPostgreSQL呼出で結果が取得できない
以下のような感じでPerlでPostgreSQLからデータを取得しようとしています。 テスト用の環境ではうまく動いていたのですが、いざ本番用環境に移行すると何故か結果が取得できません。 my $command = 'psql -h 255.255.255.255 -U username -c "select * from test" |'; open( IN, $command ) while( <IN> ) { $result .= $_; } close( IN ); テスト環境ではデータが取得できていたので、プログラムの構文的には間違っていないと思うのですが、 PerlやPostgreSQL、サーバー等の環境設定について経験が浅い為、原因がさっぱり分かりません。 なお、2行目のopenには成功しているようですが、whileループ中には入っていないようです。 どのようにして原因の切り分けが出来るでしょうか? また、解決にはどのようにすれば良いでしょうか? ※補足要求をいただければ、比較的早く補足できると思いますので、 必要な情報があれば合わせてご指示ください。 ※原因の切り分けがちゃんと出来ていないため、カテゴリが違う可能性があります。 ご容赦ください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
やっとわかってきました。 最終的にはブラウザに出力したいのですね。 私の推測では取得できてますね・・・。多分。 先ほどのデバッグライトを少し書き直して見ましょう。 print STDERR "DEBUG::[[$command]]\n" open( IN, $command ) || die "OPEN ERROR!!\n"; while( <IN> ) { $result .= $_; print STDERR "$result\n"; } としてみてください。 CGI実行後、Webサーバ(Apacheかな?)のerror_logにデバッグライトがはかれます。 出力結果を教えて下さい。 また、別のエラーがはかれていた場合も教えてください。 >tail -f error_log とするとリアルタイムにはかれるログがわかります。
その他の回答 (5)
- galluda
- ベストアンサー率35% (440/1242)
どもです。がると申します。 んっと…DBへの接続であれば、可能な限りDBI/DBDをお使いになることを心からお勧めいたします。 上述より若干は面倒かもしれませんが、木目細やかにSQLが扱えますよ。 もし追加でご質問いただければ、DBIの使い方など書き込みできるかと思いますのでお気軽に。
お礼
アドバイスありがとうございます。 ただ、プログラム自体はほぼ出来上がっているのと、あまり時間がないことからDBI/DBDについてはまた別の機会にしようと思います。
- hira6bg
- ベストアンサー率61% (8/13)
pg_hba.confのUSER列でユーザが指定されているとパスワードを聞いてきます。 ここをallとするとパスワードを聞いてこなくなります。 尚、pg_hba.confを書き換えた場合PostgreSQLの再起動が必要となります。
お礼
いろいろとありがとうございました。 パスワードについては.pgpassというファイルを使用する方法で行こうかと思います。 調べてみるとテストサーバーではこの方法になってるらしい。 でも本番環境もこの方法になってるようなのですが、効いてないようで・・・ この件については趣旨が変わってくるので別に質問させていただきます。
補足
パスワード聞いてこないというのはさすがにまずいです・・ でも原因が分かって1歩前進という感じです。
- hira6bg
- ベストアンサー率61% (8/13)
No1です。 OSの情報は下記コマンドでわかります。 > uname -a 0)print "DEBUG::[[$command]]\n"の結果はどのように表示されましたか?? 下記の意味がよくわからないのでもう少しわかりやすく説明していただけますか? >また色々試している中で、発生した現象ですが、 >このSQLコマンドは通常ブラウザからコールされるの >で、その形でテストしていますが、 >コマンドライン上からこのCGIファイルを実行すると >(perl test.cgi) >結果がちゃんと取れました・・ 1)テスト環境と本番環境では実行の仕方が違うのですか??どこからどこに実行したのかを教えてください。 (詳細に!!)
補足
本番サーバー Linux [サーバー名] 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux 本番DB Linux [サーバー名].in.[ドメイン] 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux テストサーバー Linux [サーバー名] 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux テストDB Linux [サーバー名] 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux ※本番DBだけ他とサーバー名の出方が違うのですが何か関係ありますか? テストと本番では実行しているサーバー、DBが違うだけで実行の仕方は同じです。(少なくとも同じと認識しています) 先ほどのコマンドは CGIファイルに記述していて、DBからの取得結果をブラウザ上に表示するようになっています。 しかし結果が取得できない為、close(IN)の次の行にprint $result;としていました。 この時、ブラウザから実行すると何も表示されません。(ソース表示で確認) 一方サーバーで perl test.cgiとして実行した場合、DBからの取得結果が正しく表示できました。(こちらの方法は本番でのみ確認)
- hira6bg
- ベストアンサー率61% (8/13)
No1です。 0)せめてにOSやPostgreSQLやPerlのバージョンはわかりませんか? 1)本番環境とテスト環境は別サーバマシンですか? 2)本番環境のPostgreSQLのpostgresql.confで tcpip_socket = true となっていますか? 4)どちらの環境でも ******************************************** my $command = 'psql -h 255.255.255.255 -U username -c "select * from test" |'; open( IN, $command ) while( <IN> ) { $result .= $_; } close( IN ); ******************************************** を実行したのでしょうか? print "DEBUG::[[$command]]\n" open( IN, $command ) || die "OPEN ERROR!!\n"; としてデバッグしたらどうでしょうか?
補足
>OSやPostgreSQLやPerlのバージョンはわかりませんか? OSはUNIXということしか分かりません。(というかどこを見ると分かるのか・・) Perlは v5.8.0 (perl -v にて確認) PostgreSQLは 7.4.7 (psql --version にて確認) > 本番環境とテスト環境は別サーバマシンですか? 別のマシンです。 またDBもそれぞれ、別のマシンにあります。 > 本番環境のPostgreSQLのpostgresql.confで tcpip_socket = trueとなってるようです。 >どちらの環境でも 実行しています。 結果として、テスト用では結果が取得できたが、本番用では取得できませんでした。 テスト用と本番用で変わっているのはDBのIPアドレスだけです。 > print "DEBUG::[[$command]]\n" > open( IN, $command ) || die "OPEN ERROR!!\n"; やはり結果は取得できません。 またOPEN ERRORは出力されていません。 また色々試している中で、発生した現象ですが、 このSQLコマンドは通常ブラウザからコールされるので、その形でテストしていますが、 コマンドライン上からこのCGIファイルを実行すると(perl test.cgi) 結果がちゃんと取れました・・ これで原因が分かったわけではないですが、参考になれば。
- hira6bg
- ベストアンサー率61% (8/13)
テスト環境と本番環境の違いがわかりませんが、 1行目のpsqlコマンドでデータベース名を設定すると取得できませんか?? my $command = 'psql -h 255.255.255.255 -U username -c "select * from test" データベース名|';
補足
データベース名を付加しても結果は変わりませんでした。 また、テスト環境と本番環境の違いについては どこを見比べたらいいのかという点から良く分かっていないのが現状です。
補足
DEBUG::[[/usr/local/pgsql/bin/psql -h 255.255.255.255 -U username -c "select * from test'" |]] Password: psql: fe_sendauth: no password supplied となってました・・ パスワードの入力を求められてますね・・