sql >> データベース >  >> RDS >> Mysql

PerlおよびXPath:データベーステーブルにエントリがありません

    すでに説明と修正がありますが、次の変更をお勧めします

    • prepareする必要があります INSERT INTO SQLステートメントを実行してからexecute ループ内にあります。 do オーバーヘッドがはるかに大きい

    • //descendant-or-self::node() )XPath構造は高価であり、要素がドキュメント内のどこにあるかわからない場合のために予約する必要があります。これは非常にまれです。この場合、row1 要素は/database/row1s/row1にあります およびrow2 要素はrow2s/row2にあります それに関連して

    • 引用符で囲まれた文字列内で引用符を使用する場合は、さまざまな区切り文字を使用する方がはるかにクリーンです。たとえば、"My name is \"$name\"" qq{My name is "$name"}としてはるかに優れています

    これが役立つかもしれないあなたのプログラムのバージョンです。

    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);
       }
    }
    

    出力

    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
    


    1. Oracleで連結文字列を生成する高速な方法

    2. MySQL-主キーにNULL制約は必要ありませんか?

    3. コーディングされていないCount(*)とシステムテーブル

    4. 同じフィールドが2つ存在する場合は、elseupdateを挿入します