0

DBIモジュールとを使用して、Perlでこれら2つの挿入クエリを実行しますDBD:mysql

これは、フィールド、、、urlをテーブルに挿入します。html_extr_textconcord_filesys_timearticle

my @fields = (qw(url html_extr_text concord_file sys_time));
my $fieldlist = join ", ", @fields;
my $field_placeholders = join ", ", map {'?'} @fields;

my $insert_query = qq{
    INSERT INTO article ($fieldlist)
    VALUES ($field_placeholders)
};
my $sth = $dbh->prepare($insert_query);

my $id_article;
my @id_articles;
foreach my $article_index (0 .. @output_concord_files_prepare) {
    $field_placeholders = $sth->execute(
            $url_prepare[$article_index],
            $html_pages_files_extended[$article_index],
            $output_concord_files_prepare[$article_index],
            $sys_time_prepare[$article_index]);
    $id_article = $dbh->last_insert_id(undef, undef, 'article', 'id_article');
    push @id_articles, $id_article;
    if ($field_placeholders != 1) {
        die "Error inserting records, only [$field_placeholders] got inserted: " . $sth->insert->errstr;
    }
}
print "@id_articles\n";

そしてこれeventはテーブルにフィールドを挿入しますevent

@fields = (qw(event));
$fieldlist = join ", ", @fields;
$field_placeholders = join ", ", map {'?'} @fields;

$insert_query = qq{
    INSERT INTO event ($fieldlist)
    VALUES ($field_placeholders)
};
$sth = $dbh->prepare($insert_query);

my $id_event;
my @id_events;
foreach my $event_index (0 .. @event_prepare){
    $field_placeholders = $sth->execute($event_prepare[$event_index]);
    $id_event = $dbh->last_insert_id(undef, undef, 'event', 'id_event');
    push @id_events, $id_event;
    if ($field_placeholders != 1){
        die "Error inserting records, only [$field_placeholders] got inserted: " . $sth->insert->errstr;
    }
}
print "@id_events\n";

3番目の1対多の関係テーブルを作成したいと思います。1つの記事に複数のイベントが含まれているため、次のファイルがあります。

output_concord/concord.0.txt -> earthquake
output_concord/concord.0.txt -> avalanche
output_concord/concord.0.txt -> snowfall
output_concord/concord.1.txt -> avalanche
output_concord/concord.1.txt -> rock fall
output_concord/concord.1.txt -> mud slide
output_concord/concord.4.txt -> avalanche
output_concord/concord.4.txt -> rochfall
output_concord/concord.4.txt -> topple
...

ご覧のとおり、を使用して各エントリのIDを収集しLAST_INSERT_IDます。しかし、私は次のステップをどのように行うかを本当に知りません。

このファイルを使用して、3番目のテーブル'article_event_index'に前の2つのテーブルのIDを挿入するにはどうすればよいですか。

これは次のようになります。

$create_query = qq{
    create table article_event_index(
        id_article int(10) NOT NULL,
        id_event int(10) NOT NULL,
        primary key (id_article, id_event),
        foreign key (id_article) references article (id_article),
        foreign key (id_event) references event (id_event)
    )
};
$dbh->do($create_query);

パターンに従った関係が含まれます

1-1, 1-2, 1-3, 2-4, 3-5 ...

私はPerlとデータベースの初心者なので、やりたいことを定式化するのは難しいです。私は十分に明確だったと思います。

4

1 に答える 1

0

このようなものは、必要なことを行う必要があります (テストされていませんが、コンパイルされます)。

まず、Perl ハッシュを構築して、コンコード ファイルを記事 ID に、イベントをイベント ID に関連付けます。次に、ファイルが読み取られ、既存のテーブルで見つかった関係ごとに、ID のペアが新しいテーブルに挿入されます。

ハッシュは、長いシーケンスを避けるためだけに存在することに注意してください。

SELECT id_article FROM article WHERE concord_file = ?

SELECT id_event FROM event WHERE event = ?

ステートメント。

use strict;
use warnings;

use DBI;

use constant RELATIONSHIP_FILE => 'relationships.txt';

my $dbh = DBI->connect('DBI:mysql:database', 'user', 'pass')
        or die $DBI::errstr;

$dbh->do('DROP TABLE IF EXISTS article_event_index');

$dbh->do(<< 'END_SQL');
CREATE TABLE article_event_index (
    id_article INT(10) NOT NULL,
    id_event INT(10) NOT NULL,
    PRIMARY KEY (id_article, id_event),
    FOREIGN KEY (id_article) REFERENCES article (id_article),
    FOREIGN KEY (id_event) REFERENCES event (id_event)
)
END_SQL

my $articles = $dbh->selectall_hashref(
    'SELECT id_article, concord_file FROM article',
    'concord_file'
);
my $events = $dbh->selectall_hashref(
    'SELECT id_event, event FROM event',
    'event'
);

open my $fh, '<', RELATIONSHIP_FILE
        or die sprintf qq{Unable to open "%s": %s}, RELATIONSHIP_FILE, $!;

my $insert_sth = $dbh->prepare('INSERT INTO article_event_index (id_article, id_event) VALUES (?, ?)');

while (<$fh>) {
  chomp;
  my ($concord_file, $event) = split /\s*->\s*/;
  next unless defined $event;

  unless (exists $articles->{$concord_file}) {
    warn qq{No article record for concord file "$concord_file"};
    next;
  }
  my $id_article = $articles->{$concord_file}{id_article};

  unless (exists $events->{$event}) {
    warn qq{No event record for event "$event"};
    next;
  }
  my $id_event = $events->{$event}{id_event};

  $insert_sth->execute($id_article, $id_event);
}
于 2013-03-15T13:15:05.030 に答える