• ベストアンサー

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ループ中には入っていないようです。 どのようにして原因の切り分けが出来るでしょうか? また、解決にはどのようにすれば良いでしょうか? ※補足要求をいただければ、比較的早く補足できると思いますので、  必要な情報があれば合わせてご指示ください。 ※原因の切り分けがちゃんと出来ていないため、カテゴリが違う可能性があります。  ご容赦ください。

  • Perl
  • 回答数6
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hira6bg
  • ベストアンサー率61% (8/13)
回答No.4

やっとわかってきました。 最終的にはブラウザに出力したいのですね。 私の推測では取得できてますね・・・。多分。 先ほどのデバッグライトを少し書き直して見ましょう。 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 とするとリアルタイムにはかれるログがわかります。

asahina02
質問者

補足

DEBUG::[[/usr/local/pgsql/bin/psql -h 255.255.255.255 -U username -c "select * from test'" |]] Password: psql: fe_sendauth: no password supplied となってました・・ パスワードの入力を求められてますね・・

その他の回答 (5)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.6

どもです。がると申します。 んっと…DBへの接続であれば、可能な限りDBI/DBDをお使いになることを心からお勧めいたします。 上述より若干は面倒かもしれませんが、木目細やかにSQLが扱えますよ。 もし追加でご質問いただければ、DBIの使い方など書き込みできるかと思いますのでお気軽に。

asahina02
質問者

お礼

アドバイスありがとうございます。 ただ、プログラム自体はほぼ出来上がっているのと、あまり時間がないことからDBI/DBDについてはまた別の機会にしようと思います。

  • hira6bg
  • ベストアンサー率61% (8/13)
回答No.5

pg_hba.confのUSER列でユーザが指定されているとパスワードを聞いてきます。 ここをallとするとパスワードを聞いてこなくなります。 尚、pg_hba.confを書き換えた場合PostgreSQLの再起動が必要となります。

asahina02
質問者

お礼

いろいろとありがとうございました。 パスワードについては.pgpassというファイルを使用する方法で行こうかと思います。 調べてみるとテストサーバーではこの方法になってるらしい。 でも本番環境もこの方法になってるようなのですが、効いてないようで・・・ この件については趣旨が変わってくるので別に質問させていただきます。

asahina02
質問者

補足

パスワード聞いてこないというのはさすがにまずいです・・ でも原因が分かって1歩前進という感じです。

  • hira6bg
  • ベストアンサー率61% (8/13)
回答No.3

No1です。 OSの情報は下記コマンドでわかります。 > uname -a 0)print "DEBUG::[[$command]]\n"の結果はどのように表示されましたか?? 下記の意味がよくわからないのでもう少しわかりやすく説明していただけますか? >また色々試している中で、発生した現象ですが、 >このSQLコマンドは通常ブラウザからコールされるの >で、その形でテストしていますが、 >コマンドライン上からこのCGIファイルを実行すると >(perl test.cgi) >結果がちゃんと取れました・・ 1)テスト環境と本番環境では実行の仕方が違うのですか??どこからどこに実行したのかを教えてください。 (詳細に!!)

asahina02
質問者

補足

本番サーバー  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)
回答No.2

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"; としてデバッグしたらどうでしょうか?

asahina02
質問者

補足

>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)
回答No.1

テスト環境と本番環境の違いがわかりませんが、 1行目のpsqlコマンドでデータベース名を設定すると取得できませんか?? my $command = 'psql -h 255.255.255.255 -U username -c "select * from test" データベース名|';

asahina02
質問者

補足

データベース名を付加しても結果は変わりませんでした。 また、テスト環境と本番環境の違いについては どこを見比べたらいいのかという点から良く分かっていないのが現状です。

関連するQ&A

  • postgreSQLで更新後のデータを取得したい。

    postgreSQLで更新後のデータを取得したい。 初めて質問させていただきます。 postgreSQLでupdateした後、更新後のデータをselectで取得したいのですが、 トランザクションが完了するまでにselect文が発行されているみたいで、更新前のデータを取得してしまいます。 それぞれ、違うファイルから投げられているので、同じトランザクションにすることはできません。 何かいい方法があればご教授お願いします。 a.phpで下記のSQLを発行 update test_tbl set test1 = 'aaa' where test2 = 'bbb' a.phpが走っている間に、下記のb.phpが実行される。 select test1 from test_tbl 環境 php5 postgres8.1

  • perl ファイルが開かない

    perl でファイルを開きたいのですが、なぜか開けません。何がいけないのでしょうか?エラーは、 Name "main::file" used only once: possible typo とでます。エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが、悩んでいます。OSはubuntuです。 #!/usr/bin/perl -w open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN);

  • mac PostgreSQLのアンインストール方法

    皆様 いつもお世話になります。 早速ですがご質問させて頂きます。 Postgresqlを使ったシステム開発の勉強するため、最新版をインストールしようと思っています。 (利用しているPCは中古で購入したものなので)あらかじめ入っていたPostgresqlを アンインストールしようと思ったのですが、方法が分からず困っています。 PCにPostgresqlがあらかじめ入っているかどうかは以下のコマンドで確認しました。 #psql --version psql (PostgreSQL) 9.1.9 contains support for command-line editing とりいそぎGoogleで検索してみたところ、 /Library/PostgreSQL/(Postgresqlのバージョン)/uninstall-postgresql.app にてアンインストールできるらしいのですが、/Libraryディレクトリ以下にPostgreSQLディレクトリがありませんでした。 作業が進まずほとほと困っています。 どなたかお詳しい方ご教授のほど何卒宜しくお願い致します! 環境: MacOSX 10.8.5 Postgresql9.1.9

  • CGIで外部コマンドを実行したときのエラーメッセージを取得したい

    PerlCGIで外部コマンドを実行して実行結果を取得する場合、パイプを利用して、 open(IN, "date |"); while (<IN>) { print $_; } close(IN); などとして結果の取得はできたのですが、 間違ったコマンドを指定した場合には、 エラーメッセージが取得できません。 たとえば、 $data などという間違ったコマンドを入力したときに、 bash: data: command not found という内容をCGIで取得したいのですが、 open(IN, "data |"); while (<IN>) { print $_; } close(IN); のような記述では取得できませんでした。 このようなエラー内容を取得する方法はありませんでしょうか? どうかよろしくお願いします。

    • ベストアンサー
    • CGI
  • Perlで行頭にある文字が含まれている行を全部削除して詰めたい

    perl初心者です。以下のようにデータがならんでいる時、 test111 aaaaaaaaabbbbbbbbcccccc test112 aaaaccccabbbbbbbbcccccc test113 aaaaccaaabbbbbbbbcccccc test114 acccaaaaabbbbbbbbcccccc test111 aacaaaaaabbbbbbbbcccccc test112 accaaaaaabbbbbbbbcccccc test113 aaacccaaabbbbbbbbcccccc test114 aaaaaccaabbbbbbbbcccccc test112の行だけ削除して、さらにそこを詰めたい時のスクリプトを作成しています。 途中からわかりません。 行を削除する関数が調べても見つからないのです。 #!/usr/bin/perl ; open(IN, "test.doc") or die ; open(OUT, ">testout.doc"); while(<IN>) { chomp ; if (/(\S+)/) { $name = $1 ; if ($name =~ /^test112(\S+)/) { #ここでマッチさせて、一気に行を削除して、しかも行を詰めたいのですが ; } print OUT " \n" ; } } close (IN) ; close (OUT) ; 大変困っております。宜しくお願いします。

    • ベストアンサー
    • Perl
  • PostgreSQLのpsqlが強制終了されます

    Windows7 psql9.0.5 環境のPostgreSQLにおいて psql実行時に空エンターを6,7回すると postgres=# 入力ファイルから読み込めませんでした: Not enough space \q 続行するには何かキーを押してください . . . のメッセージが表示され 強制終了されてしまいます。 何が原因と考えられますでしょうか? ちなみにディスクはGB単位で空いておりますので問題無いかと思われます。

  • テキストデータをpostgreSQLのデータベースに一括インポートする方法(perl)

    今、テキストデータをpostgreSQLのデータベースに一括インポートする CGI(perl)にて作成中なのですが、息詰まってしまい、わかる方が いましたら、ご伝授いただければと思い質問させていただきました。 ■CGI(test-inport.cgi)    ~ 省略 ~ $cmd = "●●●"; system($cmd); $cmd = "psql -h ホスト名 -c 'copy テーブル名 from 'テキストファイル名'"; system($cmd); ※ここのホスト名は何を書いたらいいのでしょうか? 良かったら、教えて下さい。 上記ので、●●●に、telnet で使用する \i テーブル名 などを入れて、DBを作成し、そこにテキストデータを流したい と思っています。 しかし、 $cmd = "\i テーブル名"; system($cmd); が動きません。 どのように、書けばいいのでしょうか? 良かったら、教えて下さい。 また、アルゴリズム自体がおかしい場合は、 違う手法も教えていただければと思います。

    • ベストアンサー
    • Perl
  • PostgreSQLとMySQLの同時運用

    今現在、PHP・PerlなどによるCGIのテスト用のサーバを稼働させています。 そこではMySQLが稼働しているのですが、その同じサーバでPostgreSQLを同時に動かすことは可能でしょうか? 可能であれば、同じサーバで稼働させてテスト環境を動かしたいと考えています。 アドバイスお願いいたします。

  • Postfixでメールを受信したらPerlスクリプトを実行したい

    Solaris10で構築したサーバにて、ユーザー宛のメールを受信したら Perlで記述したスクリプトを実行したい為、下に記載の手順1及び2の 方法で受信メールを渡すパイプを記述したのですがスクリプトが実行されませんでした。 手順1,2共に他のメールアドレスへ転送させた場合、メールの転送は正常に行われました。 メールを受信したらPerlスクリプトを実行するには、どのように設定すればよいのでしょうか? main.cfやmaster.cfに更なる設定の記述が必要なのでしょうか? 主な環境は下記の様になっているのですが不足がありましたら御指摘下さい。 申し訳ありませんがよろしくお願いします。 【手順1】~/.forwardによるスクリプト起動     (1)~/.forwardに、下記の様な記述をしましたがスクリプト起動せず。 (.forwardの記述)        (パターン1) \username,"|/home/username/test.pl"        (パターン2) "|/home/username/test.pl"        (パターン3) |"/home/username/test.pl"        (パターン4) "|/usr/local/bin/perl /home/username/test.pl"        ※下記のような転送は処理されました         \username,username@test.ne.jp 【手順2】main.cf修正によるスクリプト起動     (1)/usr/local/etc/postfix/main.cfに下記行を作成       alias_maps = hash:/usr/local/etc/postfix/aliases,hash:/usr/local/etc/postfix/usr_alias       (usr_aliasの記述) username: :include:/home/username/include       (includeの記述) |"/home/username/test.pl"               他に上記.forwardの記述の4パターンを試しましたが全てスクリプト起動せずでした。 【サーバ環境】 OS:Solaris10(Sparc) MTA:postfix-2.5.3 【test.plの内容】 #!/usr/local/bin/perl open(DATA_FILE, "> test_log.txt"); print DATA_FILE "Test_OK!!!\n"; close(DATA_FILE);     ※備考       ・保存場所:/home/username/test.pl       ・パーミション:test.plと/home/username共に777 (オーナはusername) 【main.cfについて】 念のために allow_mail_to_files = alias,forward,include allow_mail_to_commands = alias,forward,include の記述を追加しています。

  • PHPでPostgreSQLに接続できない。

    PHPでPostgreSQLに接続しようとすると、 エラーメッセージが出て接続できません。 コマンドプロンプトからの接続は可能です。 環境:PHP5、Apache2.2、PostgreSQL8.24 全て同じサーバにインストールしています。 ********************************************* コマンドプロンプト ********************************************* >psql -U postgres -h localhost test >Password for user postgres::testpass >Type: \copyright for distribution terms >\h for help with SQL commands >\? for help with psql commands >\g or terminate with semicolon to execute query >\q to quit > > >test=# ********************************************* ↑問題なく接続できます。 ********************************************* ********************************************* PHP ********************************************* <?php $con = pg_connect("host=localhost dbname=test user=postgres password=testpass"); ?> ********************************************* エラーメッセージ 12行目は「pg_connect」のところになります。 Fatal error: Call to undefined function pg_connect() in C:\Program Files\Apache…test.php on line 12 ********************************************* php.ini ファイルはextension=php_pgsql.dll をアンコメントしてあります。 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう