- ベストアンサー
テキストデータをpostgreSQLのデータベースに一括インポートする方法(perl)
- テキストデータをpostgreSQLのデータベースに一括インポートする方法をご教授ください
- CGI(perl)を使用してテキストデータをpostgreSQLに一括インポートする方法を知りたいです
- テキストデータをpostgreSQLデータベースに一括でインポートする方法についてアドバイスをお願いします
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
connectしてからdisconnectするまでの間はいくつでもSQL文を実行してもよいのでループを使うのはいっこうに構いません。 要はSQL文の文法(構文)さえあっていればOKです。 ところで、ファイルハンドルを元に一行ずつ読み出すのに使うのは、 while<FILE>{ ではなくて while(<FILE>){ となります。
その他の回答 (4)
- Ethersky
- ベストアンサー率71% (168/235)
訂正 $db->disconnect; #切断 は正しくは $dbi->disconnect; #切断 です。 「i」が抜けてました。
- Ethersky
- ベストアンサー率71% (168/235)
$dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); $sql = "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)"; $sth = $dbi->prepare($sql); #文の実行準備 $sth->execute; #実行 $sth->finish; #終了 $db->disconnect; #切断 ↑をdoを使うと↓のようにできます。 $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); $sql = "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)"; $dbi->do($sql); #文の実行準備・実行・終了 $db->disconnect; #切断
補足
とてもわかりやすい回答有難うございます。 テキストデータを繰り返して、 INSERTする場合は、 $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); while<FILE>{ $sql = "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)"; $dbi->do($sql); #文の実行準備・実行・終了 } $dbi->disconnect; #切断 とすれば良いのでしょうか? また、foo,bar,bazが決まっていない場合、 $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password); $tmp = "foo,bar,baz"; $tmp2 = "?,?,?"; while<FILE>{ $sql = "INSERT INTO table($tmp) VALUES ($tmp2)"; $dbi->do($sql); #文の実行準備・実行・終了 } $dbi->disconnect; #切断 とすれば、それぞれ違うテーブルに対して、 データをinsertした場合、使えますでしょうか? 良かったら教えてください。
- Ethersky
- ベストアンサー率71% (168/235)
> while(<CSV>) { > chop; > my ($foo,$bar,$baz) = split /,/; > $sth->execute($foo,$bar,$baz); > } executeのみ連続でしようするということはできません。 prepareとexecuteは対です。 なお、INSERTのようにSELECTで内容を取ってくるような命令でなければ、doを使うこともできます。 doを使うとprepareとexecuteとfinishが順番にすぐ行われたことになります。
補足
すみません。doを使うとは、どのように 使えばいいのでしょうか? 良かったら教えてください。
- Ethersky
- ベストアンサー率71% (168/235)
というか、DBI等のモジュールは使わないんですか? system関数で呼ぶというのはスマートな方法とはいえないですが・・・。 (DBIとはデータベースにアクセスするためのPerl言語によるAPIのことです。) ちなみにPostgreSQLへの接続の場合はDBD::Pgと併用することになります。 少なくともsystem関数でいちいち呼ぶよりは格段に扱いやすくなります。 (自分の場合はMySQLサーバーとの接続にDBI/DBDを使っています) 例 use DBI; $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password ); #PostgreSQLサーバーへ接続 $sql = "select * from TABLE"; #文の用意 $result = $dbi->prepare($sql); #文の実行準備 $result->execute; #実行 while(@rows = $result->fetchrow_array ) { #結果取得ループ 結果(select結果)を取得して煮るなり焼くなりの処理 } $dbi->disconnect; #PostgreSQLサーバーから切断
補足
回答有難うございます。 DBI等のモジュールというのを初めて知りましたので、 教えていただいた方法で、行ってみようと 思うのですが、したいことは、一括登録になるので、 insert処理をしたいと思っています。 この場合、教えていただいた方法を参考に作成して みたのですが、このような感じで動くものでしょうか? 教えてください。 <案> use DBI; $dbi = DBI->connect("dbi:Pg:dbname=データベース名;host=SQLサーバーのホスト名", $user, $password ); #PostgreSQLサーバーへ接続 $sth = $dbh->prepare( "INSERT INTO table(foo,bar,baz) VALUES (?,?,?)" ); while(<CSV>) { chop; my ($foo,$bar,$baz) = split /,/; $sth->execute($foo,$bar,$baz); } $dbi->disconnect; #PostgreSQLサーバーから切断
お礼
DBIという方法があることを 初めて知ったにも関わらず、丁寧に回答して いただいて、本当にありがとうございます。 教えていただいた方法で作成してみようと 思います。 有難うございました。