Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Perl und XPath:fehlende Einträge in Datenbanktabelle

Sie haben bereits eine Erklärung und eine Lösung, aber ich schlage die folgenden Änderungen vor

  • Sie sollten sich prepare das INSERT INTO SQL-Anweisung und dann execute es innerhalb der Schleife. do hat einen viel größeren Overhead

  • Der // ( descendant-or-self::node() ) Das XPath-Konstrukt ist teuer und Sie sollten es für Fälle reservieren, in denen Sie keine Ahnung haben, wo sich das Element innerhalb des Dokuments befinden wird, was sehr selten vorkommt. In diesem Fall die row1 Elemente befinden sich unter /database/row1s/row1 und die row2 Elemente befinden sich unter row2s/row2 relativ dazu

  • Es ist viel sauberer, verschiedene Trennzeichen zu verwenden, wenn Sie Anführungszeichen innerhalb einer Zeichenfolge in Anführungszeichen verwenden möchten. Zum Beispiel "My name is \"$name\"" ist viel besser als qq{My name is "$name"}

Hier ist eine Version Ihres Programms, die Ihnen helfen könnte.

use strict;
use warnings;

use XML::XPath;
use DBI;

my $xp = XML::XPath->new( filename => 'animals4.xml' );

my $dbh = DBI->connect(
   'DBI:mysql:test', 'user', 'pw',
   { RaiseError => 1, PrintError => 0}
) or die "Fehler beim Verbidungsaufbau zum MariaDB-Server: $DBI::err -< $DBI::errstr\n";

my $insert_animal = $dbh->prepare('INSERT INTO animal4 (name, category, type, size) VALUES (?, ?, ?, ?)');

for my $row1 ( $xp->findnodes('/database/row1s/row1') ) {

   my $name     = $row1->getAttribute('name');
   my $category = $row1->getAttribute('category');

   printf qq{Level --- row1 "name" gives: $name\n};

   my @row2 = $xp->findnodes('row2s/row2', $row1);

   if ( @row2 ) {
      for my $row2 ( @row2 ) {

         my $type = $row2->getAttribute('type');
         my $size = $row2->getAttribute('size');

         print qq{Level row2 "type" gives: $type\n};
         print qq{Level row2 "size" gives: $size\n};

         $insert_animal->execute($name, $category, $type, $size);
      }
   }
   else {
      $insert_animal->execute($name, $category, undef, undef);
   }
}

Ausgabe

Level --- row1 "name" gives: fox
Level row2 "type" gives: 1
Level row2 "size" gives: 10
Level row2 "type" gives: 2
Level row2 "size" gives: 8
Level --- row1 "name" gives: horse
Level row2 "type" gives: 3
Level row2 "size" gives: 100
Level --- row1 "name" gives: bee
Level --- row1 "name" gives: wasp