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
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/[email protected]
でも、プールしたいという想いを偽る事ができない方も多いかと思ったので参考まで。
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に格納するには
どう書いたらよいですか??
0182nobodyさん
2005/08/17(水) 02:11:32ID:5eFyQrDL0183nobodyさん
2005/08/17(水) 03:32:05ID:???http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-32,GGLG:ja&q=perl+dbi+sql
0184nobodyさん
2005/08/17(水) 04:51:15ID:E/ZVNZ3Kよろ
0185nobodyさん
2005/08/17(水) 04:52:55ID:???0186nobodyさん
2005/08/17(水) 07:12:49ID:???http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-32,GGLG:ja&q=perl+dbi+postgresql
0187nobodyさん
2005/08/20(土) 13:04:16ID:???0188nobodyさん
2005/12/02(金) 09:27:57ID:D04WUjX+>$dbh->{unicode} = 1; # fetchしたテキストフィールドのutf8flagがオン
命名のガイドラインに従うなら"sqlite_unicode"だろ。
0189nobodyさん
2006/02/24(金) 16:36:16ID:???わざとホスト名を間違えてエラーを出したのに、
undef が帰って来なくて die されてしまうんですがなぜでしょうか?
#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect( "dbi:Pg:host=aaaaa;port=5432;dbname=hoge", 'user', 'password' );
my $status = ( $dbh eq undef ) ? $DBI::errstr : 'ok';
print qq(content-type:text/html\n\n);
print $status;
exit;
この実行結果が 500 エラー。
connectできなかったら undef がくるのではないのか…
0190nobodyさん
2006/02/24(金) 17:03:13ID:j8E2zsnz500エラーだけじゃ情報が少なすぎるので、http鯖の
エラーログを見るか、
use CGI::Carp qw(fatalsToBrowser);
を使うか、自前でconnectをevalの中で実行して$@を
表示してみるなどして、どういうエラーが出てるかを
きちんと調べることをお勧めする。
0191190
2006/02/24(金) 18:17:21ID:???エラー処理を行おうと思っているのですが、undef が帰ってこなくて悩んでいます。
ですので、エラーの内容は特に何でもいい感じです。
ちなみにエラーの内容は、ホスト名をわざと間違えて実行しているので、
エラーログにももちろん
DBI connect(...) failed: could not translate host name "aaaaa" to address: Name or service not known
が出ます。
(エラーの内容はユーザ名間違いでもなんでもいいです)
参考にしているサイトやオライリーのPerlDBI本では、
undefを見てエラーチェックする例が書かれていたので…
0192191
2006/02/24(金) 18:25:23ID:???eval , $@ を使えば正しくエラー処理できてますが、
my $dbh = DBI::connect() or mySubRoutine();
のようなことがやりたい感じですが、エラー時でも or以降に行ってくれずdieされてる感じです。
0196nobodyさん
2006/02/24(金) 20:46:26ID:???0197nobodyさん
2006/02/24(金) 22:51:21ID:???環境やバージョンに依存した何かかね? PrintErrorを0にしないと、warningは
でるけど。あるいは書いてないけどどこかでRaiseErrorを有効にしてるとか?
% perl -e 'use DBI; $dbh = DBI->connect("dbi:Pg:host=aaa", "user", "pass",); print "死んでない\n"; print "dbh ", defined $dbh? "= $dbh": "is undef", "\n";'
DBI connect('host=aaa','user',...) failed: could not translate host name "aaa" to address: Name or service not known
at -e line 1
死んでない
dbh is undef
% perl -e 'use DBI; $dbh = DBI->connect("dbi:Pg:host=aaa", "user", "pass", {PrintError=>0}); print "死んでない\n"; print "dbh ", defined $dbh? "= $dbh": "is undef", "\n";'
死んでない
dbh is undef
0198nobodyさん
2006/02/24(金) 23:27:04ID:???0199189
2006/02/25(土) 21:19:30ID:???ご指摘ありがとうございます!
RaiseErrorが有効になっていたので、
無効にしてみたらちゃんとキャッチできました…
なにかものすごい勘違いをしていたようです。
RaiseErrorを無効にしないとdieされるから
キャッチできないってオチですね。
大変失礼しました。
0200nobodyさん
2006/03/31(金) 09:14:29ID:3Vb6MUysORA-01000が出るんですが、原因がわかりません。
常に出るわけではなく、なにをきっかけにしているのか
ずーっと悩んでいます。
Class::DBIを使った場合、カーソルが開く(もしくは閉じる)タイミングというのは
いつになるんでしょうか?
なにかヒントのようなものでもよいので
お願いします。
0201nobodyさん
2006/04/12(水) 16:46:12ID:Fg0UYczLperl command line iteratorが落ちてしまいます。
そしてMicrosoftへ連絡させられる・・・。
どのあたりに原因がありそうですか?
postgreにアクセスしないperlプログラムはちゃんと動くし、
pgAdminからならちゃんとpostgreSQLは機能します。
CPAN使ってDBIとDBD-Pgをインストールしました。
windowsでこの環境構築できた人居ますか?
0202201
2006/04/12(水) 17:35:44ID:Fg0UYczL○Interpreter
0203nobodyさん
2006/04/16(日) 14:21:00ID:???普通に
WindowsXP Pro + ActivePerl 5.6.1 + DBI 1.49 + DBD::Pg 1.21 + PostgreSQL 8.1.3
で動いてますが何か?
ちなみにDBD::Pgはppmで貰ってきたやつ。
0204nobodyさん
2006/04/16(日) 15:54:09ID:???Windows2000 + perl 5.8.7 built for cygwin + DBI 1.50 + DBD::Pg 1.43 + PostgreSQL 8.0.7
だな。
0205nobodyさん
2006/04/17(月) 00:27:48ID:???Perl versions below 5.6.1 are no longer supported by the DBI.
Perl versions 5.6.x may fail during installation with a complaint
about the use of =head3 in the pod documentation.
と言われてしまった。
そろそろ5.6は捨て時かな。
(他のモジュールでも「5.8以降じゃないからダメ」とインストールさせてもらえないのも結構増えてきた)
0206nobodyさん
2006/04/20(木) 16:26:10ID:???ある行をselect ... for updateで行ロックかけつつ更新したいんだけどDBICで
for updateしつつデータを取得する方法がわからなくて困ってます。
どうすりゃいいの?
0207206
2006/04/26(水) 09:50:57ID:???$rs->search_literal('id = ?) FOR UPDATE; --', $id);
search_literalは与えた文字列のまわりを括弧でくるんでくれるので、
FOR UPDATEの部分を外に出すために途中で括弧を閉じ、そのままだと
お尻の括弧が余るのでコメントにして無視させるというかなり強引な
トリックです。
0208nobodyさん
2006/04/27(木) 20:49:50ID:???データベースはSQLite。
よくある検索画面。1000件中の11〜20件目が2ページに表示されている。
というようなとき、limitやoffsetで取得行数を減らしてパフォーマンスを
あげることはよく行われていると思う。
だが検索にマッチした行が全部で何件かを知る必要がある。
limitをつけると、制限した行数しか返ってこないから
こういうときSQLを2回発行するしかないんかな?
order by してlimitしたりするとき、内部では何行あるか知っていると思うから、
SQL文にlimitつけてても制限されてない行数をしる方法がないかなぁと期待しているんだけど。
0209nobodyさん
2006/04/27(木) 21:28:39ID:???DBIだからこうというよりはSQL一般の話なのでデータベース板の
それっぽい質問スレでで聞いたほうが知ってる人に当たる確率が
高いと思われる。
0210nobodyさん
2006/04/27(木) 22:25:15ID:???0211nobodyさん
2006/04/28(金) 07:36:40ID:???DBの実装によると思う。
逆に言えば、DBごとに行数を返したり返さなかったりすると思うから、その共通I/FであるDBIでは取得できないと思う。
素直にselect count(*)しなされ。
0212nobodyさん
2006/04/28(金) 07:52:56ID:???ちょうど都合のいいインデックスがあれば
頭からlimit数分順に拾うだけでいいかもしれない
わけだし。
0213nobodyさん
2006/04/28(金) 15:07:40ID:???0214nobodyさん
2006/05/02(火) 20:43:42ID:Hk7IzHitDBIxでLimit 4,10みたいなのできないんかねー
0215nobodyさん
2006/05/03(水) 00:22:54ID:???pagerのことかな。直接limitしたいんだよというときにはかえってめんどくさいが。
あるいはsearch_literalで >>207 とおなじやりかたでlimitもつけられそう。
(試してはいない)
0216nobodyさん
2006/05/03(水) 05:32:14ID:???compat とかわけわからなす。
0217nobodyさん
2006/05/08(月) 20:54:21ID:???Perl + Postgresqlのアプリをmysqlに移植しようとしています。
Postgresqlでは複数ステートメントを連結したSQLをDBIで渡して実行できてたのですが、
mysqlでそのまま渡すとSyntax Errorとなってしまいます。
cseというクライアントソフト経由でも同様の症状がありましたが「一括実行」という
Pstgresqlでは使ったことのない操作で複数ステートメントを順に実行できました。
Perlで実行するためには何か特殊な設定などが必要でしょうか。
宜しくお願いします。
0219nobodyさん
2006/05/11(木) 17:46:04ID:???ブラウザに表示させることはできたんですが…
これ、普通のhtmlと一緒に出す場合はどうするのでしょうか?
0221nobodyさん
2006/05/11(木) 18:44:21ID:???mhtファイルを自前で生成するとか?(笑)
0222nobodyさん
2006/05/12(金) 02:10:33ID:???バイナリ出力するスクリプトの横に別のHTMLを作って、<img src="./hoge.cgi">
なんて書いてみよう。
0223nobodyさん
2006/05/16(火) 12:53:34ID:v8uyEVX5$dbh = DBI->connect( $dsn, $user, $password );
$sth = $dbh->prepare( 'SELECT * FROM companion LIMIT 0, 3' );
$sth->execute() ;
はOKだけど、
$i = 0;
$sth = $dbh->prepare( 'SELECT * FROM companion LIMIT ?, 3' );
$sth->execute( $i ) ;
とか、
$i = 0;
$sth = $dbh->prepare( 'SELECT * FROM companion LIMIT $i, 3' );
$sth->execute() ;
だと×。なして?
0224nobodyさん
2006/05/16(火) 13:54:23ID:???- Class::DBI::Sweet
- DBIx::Class::Schema
お好きなのをどうぞ。
0225nobodyさん
2006/05/16(火) 14:21:49ID:???> $sth = $dbh->prepare( 'SELECT * FROM companion LIMIT $i, 3' );
$sth = $dbh->prepare( "SELECT * FROM companion LIMIT $i, 3" );
じゃないか?「'」 だと$iが展開されないぞ。
0226nobodyさん
2006/05/16(火) 22:54:16ID:???そんな書き方してると、注入されますよ?
0227nobodyさん
2006/05/16(火) 23:51:19ID:???0228nobodyさん
2006/05/17(水) 03:02:32ID:???LIMIT '0',3
ってかエラー吐いてるの見ればわかるでしょ?
0229nobodyさん
2006/05/17(水) 08:51:13ID:???ギャグで言ってる?$iの汚染チェックするのは当然だろ。
オレは223の解釈が違ってるからレスしただけだ。
そもそも223の最後の例はプレースホルダ使ってないし。
0230228
2006/05/17(水) 10:09:25ID:???0231nobodyさん
2006/05/18(木) 00:52:43ID:???0232nobodyさん
2006/05/31(水) 18:35:21ID:QUWCbat7([\x81\x83\x84\x89-\x9F\xE0-\xEA][\x5C])で不具合がおこります。
十十十十 → 十十\十十\
十と一を足すと十一 → 十と一を足すと十\一
と2文字毎に\マーク(0X5C)が入ってしまいます。
これはDBI内部でのエスケープ時のバグでしょうか?
携帯電話用なのでなるべくSjisを使いたいという前提で、解決法がありましたら教えてください。
0233nobodyさん
2006/05/31(水) 19:02:06ID:???内部処理はUTF-8かEUCでやって出入り口のみでSJISと変換する。
これが一番楽だと思う。内部処理をSJISでやるのはお勧めしない。
どうしてもやりたければ同じような変な現象があとからあとから出て
来るので、それととことん付き合う覚悟でどぞー。
0234nobodyさん
2006/05/31(水) 19:21:37ID:QUWCbat7お返事ありがとうございます。
携帯電話ユーザーなので、当たり前に機種依存文字を使ってきます。
丸囲み数字や、絵文字など。
他文字コードに変換すると極めて都合が悪いのです。。
文字コード変換前にそれぞれ絵文字や機種依存文字をマッピングしてやればいいのかもしれませんが、
その労力も大変なものなので、どうしたものかと
0235nobodyさん
NGNGこういうの使うのも面倒なの?
http://search.cpan.org/~hio/Unicode-Japanese-0.34/Japanese.pm
■ このスレッドは過去ログ倉庫に格納されています