簡體   English   中英

通過Perl腳本從Postgresql數據庫表中選擇時輸出不同

[英]Different output when selecting from Postgresql database table via Perl script

我面對一個奇怪的情況。 通過perl腳本我連接到Postgresql數據庫,我從具體表中選擇特定的列。 來自DB的SELECT查詢的輸出保存到File中。 當第二次執行腳本時,來自第一個選擇的文件的內容被移動到另一個文件,並且實際文件被新的選擇輸出填充。 然后我比較這兩個文件。 它們應該在兩次腳本執行時相同。 問題是,當我運行兩次腳本進行比較時,它們在一行中不同,當我第三次執行腳本時,輸出與第一次相同,當我執行第四次時,輸出是相同的和第二次一樣,這些輸出反復交替出現。 我嘗試了4種不同的方法如何從表中獲取選定的行到文件,但仍然是相同的情況,但是,數據庫中表的內容仍然是相同的。

請參閱以下代碼:

use strict;
use warnings;
use DBI;
use DBD::Pg;
use File::Copy;
use File::Compare;
use List::Compare;
use MIME::Lite;
use Data::Dumper;
use Sys::Hostname;

my $qry1 = "select id, name from nms_incident_config where enable = 'f' order by name asc";
my $ltraps = '/tmp/traps.list' ;
my $ntraps = '/opt/tools/trapcfg_check/actual_traps.list';

if(-e $ntraps ) {
    print "Actual trap list exists \n";
    move("$ntraps","$ltraps") or die "Copy failed! :$!";
      };

open my $out ,">", "/opt/tools/trapcfg_check/actual_traps.list";

#connect to db and run selects for further use

my $db = DBI->connect( "dbi:Pg:dbname=<db_name>;host=localhost;","postgres", "*******", {'RaiseError' => 1});

my $qry1s = $db-> prepare("$qry1");
$qry1s->execute();

方法1

  while (my @row = $qry1s -> fetchrow_array()) {
     $" = ",";
     print $out "@row \n";
  }

方法2

while (my @row = $qry1s->fetchrow_array()) {
  #print $out "$row[0],$row[1]\n";
  print $out join(", ", @row), "\n"
}

方法3

my ($id,$name);
$qry1s->bind_columns(\($id, $name));
while ($qry1s->fetch){
  print $out "$id, $name\n"
}

方法4

my $row;
$row = $qry1s->fetchall_arrayref([]);
foreach my $r (@{$row})
{
   print $out join(", ", @{$r}), "\n";
}

在腳本中,只有一個方法被取消注釋並使用,其余的被注釋。

$db->disconnect();

open F ,"</opt/tools/trapcfg_check/actual_traps.list" or die $!;
open F1 , "/tmp/traps.list" or die $!;

my @ntraps=<F>;
my @ltraps=<F1>;

my @lonly ;
my @nonly ;

   if ( compare( $ltraps,$ntraps ) == 0 ) {
      print "Files are same \n" ;
      die "Files are same\n";
      };

   if ( compare( $ltraps,$ntraps ) ne 0 ) { print "Files are different\n";

      my $tc = List::Compare->new(\@ltraps, \@ntraps );
         @lonly = $tc->get_complement;
#        @nonly = $tc->get_unique;
      print "Different row/s in new trap list: "."@lonly\n";

   };

輸出>

# ./tcheck_2.pl
Actual trap list exists

Files are same
Files are same

# cat /opt/tools/trapcfg_check/actual_traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecureAP

# cat /tmp/traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecur

# ./tcheck_2.pl
Actual trap list exists

Files are different
Different row/s in new trap list: 2147590214, wlsxStaUnAssociatedFromUnsecur

# cat /opt/tools/trapcfg_check/actual_traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecur

# cat /tmp/traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecureAP

# ./tcheck_2.pl
Actual trap list exists

Files are same
Files are same

# cat /opt/tools/trapcfg_check/actual_traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecureAP

# cat /tmp/traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecur

# ./tcheck_2.pl
Actual trap list exists

Files are different
Different row/s in new trap list: 2147590214, wlsxStaUnAssociatedFromUnsecur

# cat /opt/tools/trapcfg_check/actual_traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecur

# cat /tmp/traps.list | grep -i 2147590214
2147590214, wlsxStaUnAssociatedFromUnsecureAP

你能幫助我嗎 ? :) 謝謝

最好的問候Jaro

正如鮑羅丁在評論中所說 ,我需要補充一下

close $out

print循環后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM