Perl::DBI
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/12 23:35ID:xHkBB9i/DBI.org
http://DBI.perl.org
DBI-ML-J
http://member.nifty.ne.jp/hippo2000/dbi/dbi_japan.htm
DBI.pm 日本語訳
http://member.nifty.ne.jp/hippo2000/perltips/dbimemo.htm
0081山崎渉
03/05/28 17:17ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0082nobodyさん
03/05/30 14:30ID:I8fiUs9e試したんだけど、どうしてもベンチマークとると速度が遅い。
やっぱりSQL解析部分で時間食うみたいだった。
しょうがないのでSQL解析部分を自作して速度の問題を解決。
DBDは一から作るのめんどいのでDBD::Templateを使いました。
もうこれからは掲示板だろうがなんだろうがDBI使い倒してやる。
0083nobodyさん
03/05/31 06:20ID:rt7PEdog速度改良されたpmファイルアップキボンヌ
0084nobodyさん
03/05/31 23:01ID:oQuJYHeZhttp://endou.kir.jp/betu/linkvp/linkvp.html
http://s-rf9.free-city.net/page006.html
008582
03/06/03 16:07ID:lz5wO9wKSQL解析部分は見てもらえば分かりますが「ナンチャッテSQL解析」なので、
自分のプログラムに合わせて処理を付け足す必要があります。
速度とプログラムの汎用性という意味では自分的には実用的かと思います。
http://webcolle.minidns.net/perl/
0086nobodyさん
03/06/06 11:28ID:???すばーらスィ!!!!!!
sql文の練習に使えます。ありがと。
こんど、オンラインでやってみます。
postgressql+pg.pmでやるのとどっちが速いかは、
やっぱデータ量によるんでしょうね。
008782
03/06/06 16:33ID:q9w0p8v1所詮データはCSVファイルなので本物のRDBMSとは比較になりません。
・CSVに対してSQLが使える。
・DBIを使うことでプログラムの汎用性がある。
・速度的にも掲示板のログ管理程度なら実用レベルである。
・PurePerlなのでレンタル鯖等でも使える。
メリットはこんなところでしょうか。
ちなみにテーブル定義とSQL解析はプログラムごとに
付属のdbisub.plをいじらなければなりませんので。
0088nobodyさん
03/06/06 22:17ID:???ところで、川合さんの「PerlでDBI」(256倍シリーズ)買ったけど、ちょちょっ
と見ると、DBDの分類で、「自作系 (1)sqlの解析にSQL::Statementを利用」
の中に、DBD-CSVってのがある(DBD-Fileを継承)けど、>>85のは、それの兄弟
のようなものかね。
008982
03/06/08 01:44ID:???↓のURL見た方が早いかもしれませんが、中身は本の中で紹介されてた
SomeFmt.pmを少しいじっただけだと思います。
http://www.hippo2000.info/cgi-bin/KbWiki/KbWiki.pl?cmd=disp&page=DBD%3a%3aTemplate
なんか作者でもないのに勝手に宣伝してるみたいでなんか
悪いことしてる気がしてきた・・・
0091山崎 渉
03/07/15 11:13ID:???__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0092nobodyさん
03/07/24 20:46ID:???0093nobodyさん
03/07/24 21:41ID:???0094山崎 渉
03/08/02 02:24ID:???( ^^ )< ぬるぽ(^^)
0095ぼるじょあ ◆ySd1dMH5Gk
03/08/02 04:53ID:???ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。
=〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
= ◎――――――◎ 山崎渉&ぼるじょあ
0096nobodyさん
03/10/30 20:20ID:MsIzuyZ0DBD::ODBC使えって?UNIXでも使いたいんだよ。
0097nobodyさん
03/11/01 19:09ID:ryreETR00098nobodyさん
03/11/01 19:40ID:???0099nobodyさん
03/11/06 11:41ID:+rjyvfMX0100nobodyさん
03/11/07 12:36ID:???それ以降は、commit するまで1つのトランザクション
0102nobodyさん
03/11/20 16:24ID:5vqTDfspMySQLではどういった形になるのでしょうか。
只今移行中です。
MySQLの場合はfechrowはあるのですけどgetvalueが無いので
困ってます。
PostgreSQLでのDBアクセスはPgモジュール、MySQLでは
http://www.atmarkit.co.jp/flinux/rensai/mysql04/mysql04a.html
この方法をとりました。
どうか教えてください。
0103nobodyさん
03/11/20 16:44ID:???build できた経験のある人っていませんか?
0106nobodyさん
04/01/01 17:37ID:P0LnBj0e$word = "It's";
$word =~ tr/'/\\\'/;
$sth = $mydb->prepare("insert into $TABLE_name values ('$word');");
$sth->execute() ;
$sth->finish();
$mydb->disconnect();
ってやったとき"It's" の ' が消えて "Its"で登録されちゃうんですけど、どうすれば回避できますか?
$word =~ tr/'/''/; もやったけど、
DBD::Pg::st execute failed: ERROR: parser: parse error at or near "s" at character 86
ってでます。 quoteって関数使えば良いらしいけど、使い方が良くわかりません。
識者の方々殿。 よろしくお願いします。
0107nobodyさん
04/01/01 17:59ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
- $word =~ tr/'/\\\'/;
+ $word =~ s/'/\\'/g;
0108106
04/01/01 18:13ID:P0LnBj0e出来たー! 有難う。 昨日からずーーっとこれでハマッってたっす。
ところで - と + ってどういう意味?
0109106
04/01/01 18:29ID:P0LnBj0eAFOでスマソ
0110nobodyさん
04/01/01 19:11ID:???> ところで - と + ってどういう意味?
unified diff
ところで確認せずに言うけど
$sth = $mydb->prepare("insert into $TABLE_name values (?)");
$sth->execute($word);
ってやったら勝手にエスケープされんかい?
0112106
04/01/03 12:41ID:2IxFJ5oW出来ました。勉強になりました。
ありがとうございます。
0113nobodyさん
04/01/15 19:42ID:AedXtgQupush @array,$row[0];
}
print join(" ",@array);
これでレコードは全て数値で返ってくるとして、レコードが無い場合には
0を挟むようにしたいのですが、たとえば5個レコードがあると仮定して
3番目がNULLの場合には
3 4 0 52 1
でも実際には
3 4 52 1
と出力されてしまいます。
どうやったらレコードがNULLなのかどうか判断できるのでしょうか。
0114nobodyさん
04/01/15 22:17ID:???0115113
04/01/15 23:06ID:AedXtgQuなるほど。ありがとうございます。
3番目がNULLの場合ではなく、3番以降が全てNULLだとすると
3 4 0 0 0
と期待したいところ、4回目で既にレコードがないためにwhileの
ブロック内が実行されずに
3 4 0
となってしまいました。これを期待通りに出力するにはどうしたら
いいのでしょうか。
0116nobodyさん
04/01/15 23:58ID:???print join " ", map $_ + 0, @array[0..4];
以降 Perl の基本的な質問はこちらへ。
http://pc2.2ch.net/test/read.cgi/php/1072896288/
0117113
04/01/16 20:36ID:???push @array,$row[0]?$row[0]:0;
}
print join(" ",map $_ + 0,@array[0..4]);
としてみたのですが、レコードが無いと、whileブロック内が実行されないため
3 4 0 52 1
ではなく
3 4 52 1 0
になってしまいました。結局
$sth->fetchrow_arrayが必ずレコードを返すようにselect文を修正しました。
ありがとうございました。
0118nobodyさん
04/01/30 01:13ID:???曖昧な質問しても応えづらいとは思うのですが、
運用されてる方の「幸せになった話」や「なんでやねん話」を
お聞かせ願いたい。
0119nobodyさん
04/01/30 09:32ID:???0120nobodyさん
04/01/30 21:29ID:DOZLZjLQ0121nobodyさん
04/02/01 12:13ID:nycEgmtEname:text(文字型)
regist:date(日付型)
のとき
$sth = $dbh->prepare("INSERT INTO staff (name, regist) VALUES (?, ?)");
$name= "hoge";
$regist = NULL;
$sth->execute($name, $regist);
だと上手くいかないのです
0122nobodyさん
04/02/01 12:57ID:V0LjMB45個々のCGIがDBに接続するときのユーザやパスワードって皆さんどこに書き込んでいますか?
CGIにそれぞれ書き込んじゃってもいいのですが、分散するし危険な気もするので
人目にさらされない場所で一カ所で管理したいと思っています。
みなさんどうやってます?
0123nobodyさん
04/02/01 13:16ID:???つか多分それ strict 通んないだそ
>>1 にリンクされてる「DBI.pm 日本語訳」ページから 'NULL' を探せ
>>122
接続用のクラスを作ってそこに書き (/usr/local/lib/perl とかどっかその辺に)
DB 使う CGI は全部それを use してる
0124nobodyさん
04/02/01 15:55ID:nycEgmtE的確な指摘ありがとうございます
バッチリ上手くいきました
0125nobodyさん
04/02/05 15:37ID:yM4BLX2X$DB = "hogedb";
$User = "hogeuser";
$Passwd = "hogepass";
$dbh = DBI->connect("DBI:mysql:$DB:localhost", $User, $Passwd);
$login_id = $dbh->quote($login_id);
$sql = "select Cust_kanji from bb_k where login_id = " . $login_id ;
$sth->prepare($sql);
$sth->execute;
@get_data = $sth->fetchrow_array;
$Cust_kanji = $get_data[0];
$sth->finish;
$dbh->disconnect;
とやってるだけなのに、
Can't call method "prepare" on an undefined value at /u/web/bblabc/cgi-local/friends/intro_popuppreview.cgi line 56.
と怒られてしまいます。
原因として何が考えられるのでしょうか?
いろいろ調べたもののわかりませんでした。
それと不思議なのが、
同じサーバの別のスクリプトで、
DBIでMysqlにつなげて成功している場合があるということです。
どなたか教えていただければ幸いです。
0127125
04/02/05 17:27ID:???$sth->prepare($sql);
じゃなくて、
$sth = $dbh->prepare($sql);
の間違いでした。。。すみません。
まだ、DBI歴2日なもので。。。
ありがとうございます。
0128nobodyさん
04/02/07 02:17ID:7x+8FZeNコマンドラインで実行したサイの
「ex:6 rows in set (0.05 sec)」
〜secみたいなやつ
0129nobodyさん
04/02/07 18:29ID:???かなり昔に使っただけだし若干狙いが違うかもしれないが、DBI配布キットにプロファイラがある。
perldoc DBI::Profile
見てみれ
0131118
04/02/09 22:00ID:r2jpV3Tkこれって同じリモートDBマシン上の複数のDBへの接続を
キャッシュできないんですか?
マニュアルには「接続を定義するパラメータは接続属性も含めて
まったく同じでなければなりません」とあり、実際に
DBI:Proxy:hostname=192.168.0.1;port=1234;dsn=dbi:Pg:dbname=hoge1
DBI:Proxy:hostname=192.168.0.1;port=1234;dsn=dbi:Pg:dbname=hoge2
という二つの接続属性による接続を作成しても、二つ目はDBIが
panic: DBI active kids..... てな感じでエラーを吐くようなんですが。
すごくそんな訳無いやん、って気もするんですが、
そういうものなんでしょうか?
0132131=118
04/02/09 22:14ID:r2jpV3Tk問題なのはDBI::ProxyかDBDみたい。。。
0133Hippo2000
04/02/23 00:49ID:IskmOTa+テストする直接DBD::Pgを利用するように変えてみては?
DBD::Proxy-DBI::ProxyServerをApache::DBIで利用するのは、ちょっと酷な気がします。
(そっちのほうがボトルネックになるでしょう)
0134Hippo2000
04/02/23 01:01ID:IskmOTa+DBD::ODBCはUnixでも使えますけど?
MDBToolsのプロジェクトがODBCドライバを出したという話は聞いてますし、
先日、Timさんがこんなメール書いてましたけど反応なかったみたいです。
Accessing Access .mdb databases from unix (was: MS Access)
http://www.mail-archive.com/dbi-dev@perl.org/msg02755.html
MDBToolsのソースを解析しようと思ってたけどODBCドライバがあるなら
もういいかなと。
0135131
04/02/23 23:50ID:wtoD45ZJDBD::Proxyを使ってみようと思ったのはDBに接続するアプリケーションサーバが
増えたときに、コネクションの制御が(漠然と)しやすいかなと思ったのと、
接続の取得クラスをSingletonパターンで実装するとコネクションプーリングが
実現できるかもしれないかなと思ったためです。
# Apache::DBIをよく理解してなかったことも有りますが...
結局あまり詳しく追求しませんでしたが、動作が不安定なので
とりあえずは直接接続以外の方法は検討しない事にしました。
0136nobodyさん
04/03/06 11:22ID:7pY4exk3たとえばゲームのレビューを書くようなホームページを作ろうとして、
それをhtmlのページのフォームから必要な情報(ゲーム名、ゲーム会社とかレビュー内容とか)を書き込んで
それをサーバー側にデータとして蓄積していきます。
そして閲覧者が見る時に、そのゲーム名やゲーム会社名で検索できるようにするには
どのような技術を使えばよいのでしょうか。
ちなみにperlもいまいちですし、データベースの知識はミジンコくらいです><
環境は…パソコンはXPで、サーバーは有料のレンタルです。そこはperl、phpが使えるようです。
なにとぞm(__)m
0137nobodyさん
04/03/06 12:41ID:???0138nobodyさん
04/03/06 14:19ID:???0139nobodyさん
04/03/06 17:22ID:???0140nobodyさん
04/03/06 18:06ID:???0141nobodyさん
04/03/06 23:21ID:???別で聞きます…すません。
0142nobodyさん
04/03/07 01:25ID:???0143nobodyさん
04/03/07 02:51ID:FpUwyDycPerlで扱うスレで誘導されてるんで、こっちで質問させてください。
Perlから、use PgでPostgre SQLにinsertするのを書いているんですが、
なぜか登録できません。(接続はできています。)
登録するカラムが26もあるのが原因なのかと悩んでいるんですが、
何か原因考えられませんか?
ちなみに、カラムを3,4個に減らすと登録できるんです。
使ってるデータ型は、text,smallint,bool,dateだけです。
0144nobodyさん
04/03/07 12:49ID:???0145143
04/03/07 16:36ID:???0146143
04/03/07 16:41ID:5iK4kpNaif ($result->resultStatus != PGRES_COMMAND_OK) {
print "$result->resultStatus";
}
を実行したら7と表示されました。(=は半角)
これは、PGRES_NONFATAL_ERRORということでいいのでしょうか?
0147nobodyさん
04/03/07 18:28ID:???ということでよさげだが、PGRES_NONFATAL_ERROR だけでは何が起きてるのかわからんな…
たぶん詳細なメッセージが stderr なりエラーログなりに出てると思うのだが、確認できん?
なんとなくSQL文の長さ制限に引っかかってるんじゃないかという気がするのだが自信は無い
0148146
04/03/07 21:16ID:5iK4kpNaSQLのstderrはどうしたら見られるのでしょうか…?
トクトクプロフェッショナルでやってるので、telnetは使えるのですが、エラーログとかはルートじゃ無くてもOKなのでしょうか?
SQL文の流さ制限は8KB以下でいいですか?これだと8192文字には行ってないはずです。
モジュールに渡せる制限とかもあるのでしょうか?
色々書いてしまいましたが、御教授お願いします。
0149nobodyさん
04/03/07 21:22ID:???じゃなかった?
最近はDBI&DBD−Pgばかりだから忘れた
0150148
04/03/08 04:02ID:???自分でもなんでって感じなんですが、サーバーの負荷と関係あるんでしょうか?
ちなみに$conn->errorMessageは使えませんでした。
ともかくプログラム自体は合っているようなので、暫く様子見ることにします。ありがとうございました。
0151nobodyさん
04/03/08 06:53ID:???この辺が理由の気がする。
0152150
04/03/09 05:20ID:???確かについ最近まで設定ミスでRDB使えない設定になってましたし、ずさんなとこが多いのは事実のような。
でも、トラフィックはめちゃめちゃな訳では無いし、安めで色々使えるので気に入ってるのですが、他にオススメのトコありますか?
自鯖立てろは無しで…。
0153nobodyさん
04/03/10 10:25ID:???0154nobodyさん
04/03/15 22:17ID:5hxMa2mEXREAとかな。
これ以上はレンタル鯖板に行って探すか、
自鯖板行って勉強するかだな。
0155131=135
04/03/16 01:14ID:4QG7B2dVあるようで、この辺↓とか読みつつなるほどと思ったり。
ttp://mathforum.org/epigone/modperl/breetalwox/38B4DB3F.612476CE@acm.org
でも、プールしたいという想いを偽る事ができない方も多いかと思ったので参考まで。
ResourcePool by Markus Winand
ttp://search.cpan.org/~mws/
ttp://www.perldesignpatterns.com/?ResourcePool (ref
Apache-Sybase-ConPool by Michael Peppler
ttp://search.cpan.org/~mewp/
SQL-Relay
ttp://sqlrelay.sourceforge.net/
決してプロセス単位の接続永続化との比較ベンチをとる神光臨を待ってる訳じゃないですw
0156nobodyさん
04/03/31 23:28ID:???0157nobodyさん
04/05/02 03:28ID:???まずかったりしますか?
今書いてるソース、すべてつけていないもので、、、
0158nobodyさん
04/05/11 22:42ID:???MySQLをPerlから操作しようとしました。
そしたらinstall_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC ...
とエラーがでました。
恐らくモジュールが入ってないのかと思いますが
どうすればインストールできるでしょうか。
一応、Msql-Mysql-modules-1.2219と言うのをDLしてきましたが
root権限など持っていないので説明にある方法ではインストールできません。
cgiとおなじフォルダにmysql.pmを置いてやれば動くような気もしますが
取り敢えず/mysql/libの中身をまるごと置いてやっただけでは動きませんでした。
0159nobodyさん
04/05/11 23:50ID:???0161nobodyさん
04/05/12 09:20ID:???0162nobodyさん
04/05/12 09:20ID:???0163nobodyさん
04/05/12 12:09ID:???0164nobodyさん
04/05/12 12:56ID:???0165nobodyさん
04/05/12 17:30ID:???名前「no」というカラムをauto_incrementで作成してinsertすると
「no」は自動的にインクリメントされていきますがinsertと同時に
今insertしたレコードの「no」を取得する方法はありますでしょうか?
現在は
1,insertする
2,一番最後のレコードの「no」取得する
という方法をしていますがもし1と2の間にinsertされると別の「no」を
取得してしまうことになります。1〜2の間でロックを行えば解決しますが
1回のSQL発行でinsertと「no」の値を取得できるようなことは出来るのでしょうか?
0166nobodyさん
04/05/12 17:49ID:???http://dev.mysql.com/doc/mysql/ja/ODBC_and_last_insert_id.html
INSERT INTO GIRLS_DATA (no, name) VALUES(NULL, 'nobodyさん');
SELECT LAST_INSERT_ID();
0167158
04/05/12 20:10ID:???無事、使う事ができるようになりました。有難うございました。
ところで、インストールしたファイルにNullP.pmと言うファイルが有りましたが
ガッしておいたほうが良いですか?
0168nobodyさん
04/08/05 13:25ID:???DBIを経由すれば問題なく動くのでしょうか?
0169nobodyさん
04/08/06 00:05ID:???DBMSの方言に合わせたSQL文を書くのはプログラマの責任
DBIx系だとSQL方言の違いまである程度吸収してくれるモジュールがあるが
日付関数のはさすがに無いかもしれないなあ
0170168
04/08/09 13:45ID:???AUTO_INCREMENTで自動付加された値を取り出す場合、
MySQLの場合「LAST_INSERT_ID()」を使いますが、PostgreSQLの場合は
「curval('targetname')」のように行うようです。
いまはプログラムでDBに合わせてsql文を変えています。(Win環境なのでPostgresSQLは使えません・・・)
このあたりも、DBIが吸収してくれますか?
0171nobodyさん
04/08/09 14:59ID:???コマンドは用意されていますか?
自分で作るのもそう手間ではないのですが・・・。
0172nobodyさん
04/08/19 13:37ID:???他の環境でコンパイル済みのものをコピーして
パスを通してやれば問題なく動くのでしょうか?
0173nobodyさん
04/08/20 00:00ID:???0174nobodyさん
04/09/23 13:51:31ID:8pWVerC90175nobodyさん
04/11/24 21:43:11ID:???DBI:ODBC バグってるっぽい、ってのは気のせいでつか・・・?!
ActivePerl5.8/MySQL4.1.7の組み合わせで使ってて判明
確信持てないのでわかる香具師教えてくらはいな。
my $dataSource = "DBI:ODBC:test";
$dbh=DBI->connect($dataSource, $userName, $pass) || die "connect die:$!";
$sth = $dbh->prepare($query);
$sth ->execute($param) || die $dbh->errstr;
while (@row = $sth->fetchrow_array){
foreach $temp(@row){
print $temp . "\t";
}
}
ってやった結果が変なのでデバッガで見てみたら、@rowの中身が壊れてた。
テーブルの中身はほかのODBCクライアントで確認、異常なし。
壊れてたのは$queryで指定している3番目のカラムで、DB上ではvarchar(20)。
壊れてたデータは、8桁の数字の後に文字列が付いているというもので、数字だけになってた。
foreach部をdumpだっけ、書き換えてDBD側のエラーが出てきたような記憶がある。
それともActivePerl ppmパッケージのみのバグなんでしょうか・・・?
0176nobodyさん
04/11/25 03:03:01ID:???0177175
04/11/25 09:38:47ID:???ああごめんなさい、それで動いてからのカキコです。
けど、同じODBC接続でもCSEはちゃんとデータとって来れてるし、あれっ?と思って。
0178175
04/11/29 23:58:45ID:SyWDmi2S0179nobodyさん
04/12/13 09:37:18ID:LQJcn1sJ0180nobodyさん
04/12/14 18:00:43ID:gx135s3/TIMEDIFF(expr,expr2)みたいなことをしたい場合どうしたらいいでしょうか。
そうしたい場合はperlで得るepoctimeの値を保存するべき?
0181nobodyさん
2005/08/17(水) 02:05:25ID:???に番号フィールドのデータ全てを配列@aに格納、名前フィールドのデータを@bに格納するには
どう書いたらよいですか??
■ このスレッドは過去ログ倉庫に格納されています