• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テキストデータをpostgreSQLのデータベースに一括インポートする方法(perl))

テキストデータをpostgreSQLのデータベースに一括インポートする方法(perl)

このQ&Aのポイント
  • テキストデータをpostgreSQLのデータベースに一括インポートする方法をご教授ください
  • CGI(perl)を使用してテキストデータをpostgreSQLに一括インポートする方法を知りたいです
  • テキストデータをpostgreSQLデータベースに一括でインポートする方法についてアドバイスをお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.5

connectしてからdisconnectするまでの間はいくつでもSQL文を実行してもよいのでループを使うのはいっこうに構いません。 要はSQL文の文法(構文)さえあっていればOKです。 ところで、ファイルハンドルを元に一行ずつ読み出すのに使うのは、 while<FILE>{ ではなくて while(<FILE>){ となります。

sara555
質問者

お礼

DBIという方法があることを 初めて知ったにも関わらず、丁寧に回答して いただいて、本当にありがとうございます。 教えていただいた方法で作成してみようと 思います。 有難うございました。

その他の回答 (4)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.4

訂正 $db->disconnect; #切断 は正しくは $dbi->disconnect; #切断 です。 「i」が抜けてました。

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.3

$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; #切断

sara555
質問者

補足

とてもわかりやすい回答有難うございます。 テキストデータを繰り返して、 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)
回答No.2

> while(<CSV>) { > chop; > my ($foo,$bar,$baz) = split /,/; > $sth->execute($foo,$bar,$baz); > } executeのみ連続でしようするということはできません。 prepareとexecuteは対です。 なお、INSERTのようにSELECTで内容を取ってくるような命令でなければ、doを使うこともできます。 doを使うとprepareとexecuteとfinishが順番にすぐ行われたことになります。

sara555
質問者

補足

すみません。doを使うとは、どのように 使えばいいのでしょうか? 良かったら教えてください。

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

というか、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サーバーから切断

sara555
質問者

補足

回答有難うございます。 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サーバーから切断

関連するQ&A