今、テキストデータをpostgreSQLのデータベースに一括インポートする
CGI(perl)にて作成中なのですが、息詰まってしまい、わかる方が
いましたら、ご伝授いただければと思い質問させていただきました。
■CGI(test-inport.cgi)
~ 省略 ~
$cmd = "●●●";
system($cmd);
$cmd = "psql -h ホスト名 -c 'copy テーブル名 from 'テキストファイル名'";
system($cmd);
※ここのホスト名は何を書いたらいいのでしょうか?
良かったら、教えて下さい。
上記ので、●●●に、telnet で使用する
\i テーブル名
などを入れて、DBを作成し、そこにテキストデータを流したい
と思っています。
しかし、
$cmd = "\i テーブル名";
system($cmd);
が動きません。
どのように、書けばいいのでしょうか?
良かったら、教えて下さい。
また、アルゴリズム自体がおかしい場合は、
違う手法も教えていただければと思います。
No.5ベストアンサー
- 回答日時:
connectしてからdisconnectするまでの間はいくつでもSQL文を実行してもよいのでループを使うのはいっこうに構いません。
要はSQL文の文法(構文)さえあっていればOKです。
ところで、ファイルハンドルを元に一行ずつ読み出すのに使うのは、
while<FILE>{
ではなくて
while(<FILE>){
となります。
DBIという方法があることを
初めて知ったにも関わらず、丁寧に回答して
いただいて、本当にありがとうございます。
教えていただいた方法で作成してみようと
思います。
有難うございました。
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; #切断
この回答への補足
とてもわかりやすい回答有難うございます。
テキストデータを繰り返して、
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した場合、使えますでしょうか?
良かったら教えてください。
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が順番にすぐ行われたことになります。
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サーバーから切断
この回答への補足
回答有難うございます。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 USBにwindows10をいれて起動する方法 5 2022/04/14 14:29
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Excel(エクセル) エクセルで沢山のレコードの最後に追記するには? 7 2023/04/10 13:27
- その他(プログラミング・Web制作) フォルダ内の特定 拡張子のファイルを一括実行するBat ファイルについて 4 2022/04/17 09:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fetchrow_arrayとfetchrow_hash...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
Form間の値の渡し方
-
VBAで別モジュールへの変数の受...
-
例外処理のフローチャートの記...
-
モジュールの最大数はいくつな...
-
VBAで旧字体を異字体に一括で変...
-
Excel VBA 『Call』で呼び出す...
-
Excel VBAで、ユーザーフォーム...
-
モジュールとは何ですか
-
VBでグローバル変数を宣言するには
-
LCD ディスプレイを Raspberry ...
-
ベースモジュールって?
-
本当にPublicな変数(配列で)
-
エクセルVBAでシートモジュール...
-
Perlソースコードをコンパイル...
-
Excel VBAで、ユーザーフォー...
-
EXECEL VBA コマンドボタンか...
-
VBA モジュールを閉じるショー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fetchrow_arrayとfetchrow_hash...
-
perlでdb(mysql)に接続
-
perlのdbi-connect処理のエラー
-
PerlソースでのSQLのエラーにつ...
-
PerlでMySQLのテーブル一覧取得
-
ActivePerl を使用して MySQL に
-
MySQLのトランザクションについて
-
テキストデータをpostgreSQLの...
-
CGIからデータベースにデータを...
-
データベースにアクセス出来ま...
-
perlでのDBI接続
-
CGI(perl)データベースを教えて...
-
DBIでメールアドレスにマッチさ...
-
データベースへのデータの受け渡し
-
Oracleのデータベースに接続で...
-
ファイルデータ内容を SQL条件...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
おすすめ情報