mysqlで大量のデータをまとめて登録する場合、LOAD DATAコマンドを使用して、次のように実行できます。
#!/usr/local/bin/perl use strict; use DBI; use Data::Dumper; my $CONF_DB = {host => "localhost", port=> "3306", db_name=> "test", db_user=> "test_user", db_pass=> "ないしょ", db_opt=>{AutoCommit=>0, RaiseError=>1, mysql_enable_utf8=>1, on_connect_do => ["SET NAMES 'utf8'", "SET CHARACTER SET 'utf8'"] } }; main(@ARGV); sub main { my ($table_name,$file_path) = @_; my $dbh = connect_db(); my $sql =<<EOF; LOAD DATA INFILE '$file_path' INTO TABLE $table_name FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' EOF my $sth = $dbh->prepare($sql); unless ($sth->execute()){ die $sth->errstr; } $dbh->commit(); $dbh->disconnect(); } sub connect_db { my $db = "DBI:mysql:database=$CONF_DB->{db_name};host=$CONF_DB->{host}"; my $dbh = DBI->connect($db, $CONF_DB->{db_user}, $CONF_DB->{db_pass}, $CONF_DB->{db_opt}); #DB option設定 return $dbh; }
「GRANT FILE ON *.* TO user_name@localhost;」が必要だったような...
先程のperl scriptは、mysql ver.5.1.46では問題なく実行できました。
ただ、ver.5.1.41辺りで同様のscriptを実行した際、次のようなエラーで怒られたので、わざわざ GRANT FILE ON *.* TO user_name@localhost; を行った記憶がありますが、なぜ今回は、問題なく実行できたんだろう...
DBD::mysql::st execute failed: The used command is not allowed with this MySQL version at ...