Perl::DBI
■ このスレッドは過去ログ倉庫に格納されています
256倍本で DBI のが出たね。 まだ見てないけど。 ところで、Perl::DBI って書き方あるの? DBI256倍は14日発売じゃなかったか? Perl::DBIは今考えた。 Perl-DBIとかPerl/DBIじゃしっくりこないかと思って。 >>5 売っているのを見たってだけで、中を見たわけじゃない。 すまん。 >>7 ,6 買ってみることにするよ これもいちおうはとこう 「入門 Perl DBI」(Programming the Perl DBI) http://www.oreilly.co.jp/BOOK/perldbi/ ∧∧ (^▽^) 新スレおめでとうございまーす♪ ヾcUUっ Perl 256 DBI編は「DBIを使うため」の本じゃなくて「DBDを作るため」の本ですね。 マニアな内容でイイです。 まだ前半しか読んでないけど、英訳すれば英語圏でもちゃんと売れそうな内容っすね。さすが。 で、ジョーク(?)が日本固有なものじゃないのは、著者の川合さんがその辺を想定してるからかな。 読みました。 EffectivPerlわかるくらいのひとなら かなりおもしろいはず。 DBIて奥深いね。 やっと入手。 流石に濃いね。 でも256本の特徴なのか <BIG>こんなの</BIG> が沢山あるのが読みにくい…。 MySQLについて詳しい書籍はないでしょうか? PostgreSQL本はよく見かけるんですが… 補足です、PerlでMySQLを使いたいのです。 PHPとの組み合わせがメインのものが多くて・・ レスが・・・ >>17 ありがとうございます。 ネット上の資料を点々としていました。 早速明日本屋に寄ってきます。 DBDを書くのって馬鹿みたいにメンドクサイのだが、 この辺の構造に誰も文句いったことないんかね? >>19 まぁ、Tim神の怒りをかったら終わりだからなぁ。 本発見、MLの人だ。このシリーズ、最近紙質落としてなかたけ >>25 なぜそう思ったのか400字以内で説明せよ。 Cマガジンで Perl DBI の連載が始まる (始まった?) らしいね。結城さんの連載と入れ替わりなのかな。 読んだヒトいる? 漏れはプローガ先生の記事が無い Cマガは買う気がしないけど。 なんか今日会社にきた取引先の人が、 MYSQL+Perl(DBI/DBD)で開発することについて 「そのようなやり方は聞いたことがありませんねぇ。 普通はMYSQL+PHPですよ。」 とか言ってたんだけどそんなにMYSQL+Perl(DBI/DBD) ってマイナーなやり方なのかな? それともそいつが勉強不足なだけ? 彼の「普通」がそうだっただけ。 ドメインによって色々な「普通」有るからなぁ。 大抵の奴が自分の属しているドメインの「普通」が 普通だと思ってるからたちが悪い。 つーかその人Web関係のSEらしいんだけど、 もうちょっと勉強しろと言いたい。 >>29 単に Perl を避けているだけでは? 漏れの周りには、 「Perl ってモジュールとか入れなきゃいけないか ら面倒じゃないですか。PHP が簡単だから PHP に しましょうよ」なんて言うヒトもいる。そんなレベ ルの話じゃないのかな? 「普通」なんて言い方は、自分の常識を押し付けた いときに使うよ。漏れの場合(w 確かにMySQL+PHPと比べた場合MySQL+Perl(DBI/DBD)のが面倒に思える もっとDBI/DBDは知られてほしいなぁ。 PostgreSQLのシーラカンス本では、Ruby、JSP、PHPなどとの 連携は紹介されているのにPerlとの連携に関しては触れられてない。 なんでだよ! なんとなくMacOSX 10.2にperl+postgresqlの環境を作ろうと 思ったのですが、DBIとDBDのモジュールのインストールが 難しい。よく分からないエラーがでてしまいます。 成功してる人、教えて!!! >>38 「よく分からないエラーが出てしまいます」じゃ誰だって教えられないよ。 >>39 いや、もちろんそうなんだけどね。 どのようなエラーが出るかちゃんと報告すれば ちゃんと教えてくれるから。>>36 なぜWebプログラミング板でこのスレが上がってこないんだ? DBD::CSV DBD::File 排他処理が不安で使ってない香具師 WebProg ったって個人サイトの掲示板みたいなのも含まれるだろうしね。 ログ100件ぐらいだったらファイルで充分だったりする。 数千件 数万件でもやりようによってはCSVで十分な パフォーマンス出せたりする。 DBI DBDはインストールできればあとはSQLの書き方なわけで DBIは常用していても話題がないのよ。 >>45 最近、DBD::CSVがバージョンアップしてJOINもできるようになったYO! とか色々あるだろ。なんか、PHPはDBとの連携ができるけどPerlは できないとか変な偏見があるみたいだからちょっと悔しかったりする。 >>46 そんな偏見ははじめて聞いたが……。 悔しいことは悔しいね。 んで、DBD::CSVのロック機構はどうなってるの? 悔しい? かわいそうな人達なのでやさしく教えてあげてください。 >>32 Perlはプログラマによって非常に観やすくいい仕事するCGIと 非常に乱雑で適当に仕事するCGIに大きく分かれるよね。 PHPもエラーメッセージがブラウザで確認されてしまうのが厄介。 (というかカッコワルイ) CPANモジュールも普通にXで使うのなら便利なんだけど・・ ウェブサイト用CGIとして使うと余計なモジュールが多すぎてヘタすりゃ いらないモジュールまで取り込んでしまうプログラマもいるみたい。 (そういう人は影で笑っておけば・・・済まないか w) >>49 >PHPもエラーメッセージがブラウザで確認されてしまうのが厄介。 >(というかカッコワルイ) 貴殿はPHPを使ったことが無いとお見受けしました。 >>49 いらないモジュールuseしても問題ないだろ。 >CPANモジュールも普通にXで使うのなら便利なんだけど・・ xで使うねぇ・・・ 貴殿はちょっとLinuxかじった房 だとお見受けしました。 >>52 > いらないモジュールuseしても問題ないだろ。 いやー、問題ないとは言えないでしょ。 メモリの無駄だし、標準関数をオーバーライドするモジュールもあるし。 インストールは、ディスクが無駄な以外問題ないと思うけど。 >>49 の「取り込む」の意味が不明なので話の前提がわからんが、 49がアレだというのには同意する。 勉強するには本を買うしかないのですか? なんにも分かってない状態なので、 とりあえず“入門Perl DBI”を注文してあるのですが、 それが届くまでの間、どこかに分かりやすいサイトがないものかと。 いろいろ見て回ったものの、正直、ぜんぜん理解できませんでした・・・ ってことは、本を買っても理解できないってことになるのだろうか・・・ あと、入門書として“入門Perl DBI”は最適でしょうか? インポート無しでuseすれば名前空間は汚れないし。。 自分の空間にしかインポートされないから、勝手に汚染されることはないじゃろ。 どうせモジュールなんてmod_perlがキャッシュしてくれるから、分かりやすいように書けばよろしい。 use hogehoge (); あぁ文章がめちゃくちゃだった。。 もっとまともな説明は、 use モジュールの名前 (インポートする関数名のリスト); 2つ目のリストが省略されたら、モジュールのデフォルトのものがインポートされる。 もちろん、デフォルトが何もインポートしない、になっているかもしれない。 つまり、、、 use Module () と、require Moduleは、いつ読み込まれるか、っていう違い(コンパイル時、 実行時)はあるけれど、結果的には同じことがおきる。 object の package って require しても使えるんだっけ? use → モジュールが読み込まれ、関数が自動的にインポートされる。返り値は? require → モジュールが読み込まれるだけで、インポートはされない。成功すれば真の値をかえす。 という理解でいいかな。 マジレスすると use Module @list は BEGIN { require Module; Module->import(@list) } と等価、 no Module @list は BEGIN { Module->unimport(@list) } と等価だ。 import 関数は Perl 標準の Exporter モジュールから 継承してるケースが殆どだから、シンボルの輸出入に 関する仕組みは Exporter の POD を読めば理解できる。 しかし import を自前で実装してるモジュールもあるし、 require した段階で main パッケージに割り込む行儀の 悪いモジュールもある。よって use Module (); で確実に 輸入規制ができるとは限らない。 use は sub NAME と同じく宣言だから戻り値は無い。 my $rv = use Module; は構文エラーになるし、無理矢理 my $rv = eval { use Module; }; 等としても undef が入るだけ。 あぁ。そうかぁ。require時の初期化の時点で勝手に割り込むやつもいるのか。。 このあたりは、Perl教なら、リビングの法則でなんとか説明するところかな。(?) DBD::Access誰か作ってくれないかなぁ。 てゆーか誰も作ってないってことは難しいのかなぁ。 ODBC 経由では無理だった?もしくは、ADOとか。 >>68 いや、今はWindowsXP+ActivePerl+DBD::ODBCなんですけど、 例えばLinuxのレンタルサーバーのUserディレクトリとかで 手軽に使えたらいいなーって思ったんですけど。 SELECT文実行後にfinish しないとまずいですか? prepare_cachedを使うときはfinishしないと駄目。かも。 Perlを256倍使うための本DBI編買ったよ。 てゆーかPerlの256本ってこれだけだよね? Rubyはいっぱい出てるのに。 DBD::CSVはPure PerlだからTelnet使えないレンタル鯖で 使えるかと思いきや、中でText::CSV_XS使っているという罠。 DBD::Template使ったことある香具師いる? あれいいね。 ━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━― ∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉 どうしてもCSVファイルにDBI使いたくてDBD::CSVやDBD::Spriteを 試したんだけど、どうしてもベンチマークとると速度が遅い。 やっぱりSQL解析部分で時間食うみたいだった。 しょうがないのでSQL解析部分を自作して速度の問題を解決。 DBDは一から作るのめんどいのでDBD::Templateを使いました。 もうこれからは掲示板だろうがなんだろうがDBI使い倒してやる。 >>82 速度改良されたpmファイルアップキボンヌ DBD::Templateを使ったサンプルをUPしておきました。 SQL解析部分は見てもらえば分かりますが「ナンチャッテSQL解析」なので、 自分のプログラムに合わせて処理を付け足す必要があります。 速度とプログラムの汎用性という意味では自分的には実用的かと思います。 http://webcolle.minidns.net/perl/ >>85 すばーらスィ!!!!!! sql文の練習に使えます。ありがと。 こんど、オンラインでやってみます。 postgressql+pg.pmでやるのとどっちが速いかは、 やっぱデータ量によるんでしょうね。 >>86 所詮データはCSVファイルなので本物のRDBMSとは比較になりません。 ・CSVに対してSQLが使える。 ・DBIを使うことでプログラムの汎用性がある。 ・速度的にも掲示板のログ管理程度なら実用レベルである。 ・PurePerlなのでレンタル鯖等でも使える。 メリットはこんなところでしょうか。 ちなみにテーブル定義とSQL解析はプログラムごとに 付属のdbisub.plをいじらなければなりませんので。 >>87 ところで、川合さんの「PerlでDBI」(256倍シリーズ)買ったけど、ちょちょっ と見ると、DBDの分類で、「自作系 (1)sqlの解析にSQL::Statementを利用」 の中に、DBD-CSVってのがある(DBD-Fileを継承)けど、>>85 のは、それの兄弟 のようなものかね。 DBD-Templateは河合さん作です。 ↓のURL見た方が早いかもしれませんが、中身は本の中で紹介されてた SomeFmt.pmを少しいじっただけだと思います。 http://www.hippo2000.info/cgi-bin/KbWiki/KbWiki.pl?cmd=disp&page=DBD%3a%3aTemplate なんか作者でもないのに勝手に宣伝してるみたいでなんか 悪いことしてる気がしてきた・・・ __∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄ ∧_∧ ∧_∧ ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。 =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕 = ◎――――――◎ 山崎渉&ぼるじょあ 誰かDBD::Access作ってよ。 DBD::ODBC使えって?UNIXでも使いたいんだよ。 DBIでトランザクション処理ってどのようにやるんですか? AutoCommit をoff(0)にしたら それ以降は、commit するまで1つのトランザクション DBモジュールの件で質問ですが、PostgreSQLのgetvalueって、 MySQLではどういった形になるのでしょうか。 只今移行中です。 MySQLの場合はfechrowはあるのですけどgetvalueが無いので 困ってます。 PostgreSQLでのDBアクセスはPgモジュール、MySQLでは http://www.atmarkit.co.jp/flinux/rensai/mysql04/mysql04a.html この方法をとりました。 どうか教えてください。 FreeBSD の compat/linux 環境で Oracle 9i の DBD::Oracle を build できた経験のある人っていませんか? >>102 なんかあちこちで見かけるなw selectall-xxx とかじゃだめかねえ >>104 selectrowにしました。 ありがとうございました。 $mydb = DBI->connect("dbi:Pg:dbname=$DB_name","$DB_user","$DB_pwd"); $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って関数使えば良いらしいけど、使い方が良くわかりません。 識者の方々殿。 よろしくお願いします。 >>106 http://www5a.biglobe.ne.jp/ ~n_rieko/perl/8.htm - $word =~ tr/'/\\\'/; + $word =~ s/'/\\'/g; >>107 出来たー! 有難う。 昨日からずーーっとこれでハマッってたっす。 ところで - と + ってどういう意味? あ、わかった。 trは1文字づつそれぞれ評価されて置換されるってことね。 AFOでスマソ >>108 > ところで - と + ってどういう意味? unified diff ところで確認せずに言うけど $sth = $mydb->prepare("insert into $TABLE_name values (?)"); $sth->execute($word); ってやったら勝手にエスケープされんかい? >>106 「perl dbi プレースホルダ」でググれ >>110 出来ました。勉強になりました。 ありがとうございます。 while (@row = $sth->fetchrow_array) { push @array,$row[0]; } print join(" ",@array); これでレコードは全て数値で返ってくるとして、レコードが無い場合には 0を挟むようにしたいのですが、たとえば5個レコードがあると仮定して 3番目がNULLの場合には 3 4 0 52 1 でも実際には 3 4 52 1 と出力されてしまいます。 どうやったらレコードがNULLなのかどうか判断できるのでしょうか。 push @array,$row[0] ? $row[0] : 0; >>114 なるほど。ありがとうございます。 3番目がNULLの場合ではなく、3番以降が全てNULLだとすると 3 4 0 0 0 と期待したいところ、4回目で既にレコードがないためにwhileの ブロック内が実行されずに 3 4 0 となってしまいました。これを期待通りに出力するにはどうしたら いいのでしょうか。 >>115 print join " ", map $_ + 0, @array[0..4]; 以降 Perl の基本的な質問はこちらへ。 http://pc2.2ch.net/test/read.cgi/php/1072896288/ while (@row = $sth->fetchrow_array) { 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文を修正しました。 ありがとうございました。 Apache::DBI 環境下での DBI::Proxy ってどのくらいの枯れぐあいですか? 曖昧な質問しても応えづらいとは思うのですが、 運用されてる方の「幸せになった話」や「なんでやねん話」を お聞かせ願いたい。 プレースホルダにNULL値をバインドさせたいときはどうやるのでしょうか? name:text(文字型) regist:date(日付型) のとき $sth = $dbh->prepare("INSERT INTO staff (name, regist) VALUES (?, ?)"); $name= "hoge"; $regist = NULL; $sth->execute($name, $regist); だと上手くいかないのです Apache::DBI入れてみました。 個々のCGIがDBに接続するときのユーザやパスワードって皆さんどこに書き込んでいますか? CGIにそれぞれ書き込んじゃってもいいのですが、分散するし危険な気もするので 人目にさらされない場所で一カ所で管理したいと思っています。 みなさんどうやってます? >>121 つか多分それ strict 通んないだそ >>1 にリンクされてる「DBI.pm 日本語訳」ページから 'NULL' を探せ >>122 接続用のクラスを作ってそこに書き (/usr/local/lib/perl とかどっかその辺に) DB 使う CGI は全部それを use してる >>123 的確な指摘ありがとうございます バッチリ上手くいきました use DBI; $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につなげて成功している場合があるということです。 どなたか教えていただければ幸いです。 >>126 $sth->prepare($sql); じゃなくて、 $sth = $dbh->prepare($sql); の間違いでした。。。すみません。 まだ、DBI歴2日なもので。。。 ありがとうございます。 DBIで掛かった時間て取得できないのでしょうか? コマンドラインで実行したサイの 「ex:6 rows in set (0.05 sec)」 〜secみたいなやつ >>128 かなり昔に使っただけだし若干狙いが違うかもしれないが、DBI配布キットにプロファイラがある。 perldoc DBI::Profile 見てみれ ちまちまApache::DBIを触ってみてるんですが、 これって同じリモート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..... てな感じでエラーを吐くようなんですが。 すごくそんな訳無いやん、って気もするんですが、 そういうものなんでしょうか? あ、いや、違いますね。 問題なのはDBI::ProxyかDBDみたい。。。 >>131 テストする直接DBD::Pgを利用するように変えてみては? DBD::Proxy-DBI::ProxyServerをApache::DBIで利用するのは、ちょっと酷な気がします。 (そっちのほうがボトルネックになるでしょう) >>96 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ドライバがあるなら もういいかなと。 >>133 DBD::Proxyを使ってみようと思ったのはDBに接続するアプリケーションサーバが 増えたときに、コネクションの制御が(漠然と)しやすいかなと思ったのと、 接続の取得クラスをSingletonパターンで実装するとコネクションプーリングが 実現できるかもしれないかなと思ったためです。 # Apache::DBIをよく理解してなかったことも有りますが... 結局あまり詳しく追求しませんでしたが、動作が不安定なので とりあえずは直接接続以外の方法は検討しない事にしました。 すません。質問っす。 たとえばゲームのレビューを書くようなホームページを作ろうとして、 それをhtmlのページのフォームから必要な情報(ゲーム名、ゲーム会社とかレビュー内容とか)を書き込んで それをサーバー側にデータとして蓄積していきます。 そして閲覧者が見る時に、そのゲーム名やゲーム会社名で検索できるようにするには どのような技術を使えばよいのでしょうか。 ちなみにperlもいまいちですし、データベースの知識はミジンコくらいです>< 環境は…パソコンはXPで、サーバーは有料のレンタルです。そこはperl、phpが使えるようです。 なにとぞm(__)m データベースだろうと、勝手に脳内変換して、DBIスレに書き込んじゃったとか。 あ、ここ場違いだった??>< 別で聞きます…すません。 別で聞いてもオマイの質問じゃ碌な答えはかえらねぇよ DBIじゃなくて、Pgモジュール使ってるんですが、 Perlで扱うスレで誘導されてるんで、こっちで質問させてください。 Perlから、use PgでPostgre SQLにinsertするのを書いているんですが、 なぜか登録できません。(接続はできています。) 登録するカラムが26もあるのが原因なのかと悩んでいるんですが、 何か原因考えられませんか? ちなみに、カラムを3,4個に減らすと登録できるんです。 使ってるデータ型は、text,smallint,bool,dateだけです。 登録できない場合にエラーが出てないかをまず確認すること if ($result->resultStatus ! 切れてしまったので、再度 if ($result->resultStatus != PGRES_COMMAND_OK) { print "$result->resultStatus"; } を実行したら7と表示されました。(=は半角) これは、PGRES_NONFATAL_ERRORということでいいのでしょうか? >>146 ということでよさげだが、PGRES_NONFATAL_ERROR だけでは何が起きてるのかわからんな… たぶん詳細なメッセージが stderr なりエラーログなりに出てると思うのだが、確認できん? なんとなくSQL文の長さ制限に引っかかってるんじゃないかという気がするのだが自信は無い 早速のレスありがとうございます。 SQLのstderrはどうしたら見られるのでしょうか…? トクトクプロフェッショナルでやってるので、telnetは使えるのですが、エラーログとかはルートじゃ無くてもOKなのでしょうか? SQL文の流さ制限は8KB以下でいいですか?これだと8192文字には行ってないはずです。 モジュールに渡せる制限とかもあるのでしょうか? 色々書いてしまいましたが、御教授お願いします。 $conn->errorMessage じゃなかった? 最近はDBI&DBD−Pgばかりだから忘れた なんか、深夜にやったら動きました。 自分でもなんでって感じなんですが、サーバーの負荷と関係あるんでしょうか? ちなみに$conn->errorMessageは使えませんでした。 ともかくプログラム自体は合っているようなので、暫く様子見ることにします。ありがとうございました。 >トクトクプロフェッショナルでやってるので、 この辺が理由の気がする。 tok2 proが原因ですか…? 確かについ最近まで設定ミスでRDB使えない設定になってましたし、ずさんなとこが多いのは事実のような。 でも、トラフィックはめちゃめちゃな訳では無いし、安めで色々使えるので気に入ってるのですが、他にオススメのトコありますか? 自鯖立てろは無しで…。 >>152 XREAとかな。 これ以上はレンタル鯖板に行って探すか、 自鯖板行って勉強するかだな。 database connection pooling は dbi の世界ではある種宗教的な問題でも あるようで、この辺↓とか読みつつなるほどと思ったり。 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 mod_auth_dbiのApache2用って無いのかな? DBD::Pg使ってますが、executeのあとにfinishしないと まずかったりしますか? 今書いてるソース、すべてつけていないもので、、、 某所でスレ違いと言われこちらに誘導されこちらにも書かせてもらいますが、 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の中身をまるごと置いてやっただけでは動きませんでした。 >>159 root権限を持っていないのでその方法では出来ません。 perl Makefile.PL したあと、できた Makefile を手で書き換える DBI mysqlを利用しています。 名前「no」というカラムをauto_incrementで作成してinsertすると 「no」は自動的にインクリメントされていきますがinsertと同時に 今insertしたレコードの「no」を取得する方法はありますでしょうか? 現在は 1,insertする 2,一番最後のレコードの「no」取得する という方法をしていますがもし1と2の間にinsertされると別の「no」を 取得してしまうことになります。1〜2の間でロックを行えば解決しますが 1回のSQL発行でinsertと「no」の値を取得できるようなことは出来るのでしょうか? すみません自己解決しました。 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(); >>159-164 無事、使う事ができるようになりました。有難うございました。 ところで、インストールしたファイルにNullP.pmと言うファイルが有りましたが ガッしておいたほうが良いですか? 日付の加減算などを行う関数はMySQLとPostgreSQLで異なるようですが DBIを経由すれば問題なく動くのでしょうか? DBI は、プログラマが用意したSQL文をDBMSに投げる部分を共通化しているだけなので、 DBMSの方言に合わせたSQL文を書くのはプログラマの責任 DBIx系だとSQL方言の違いまである程度吸収してくれるモジュールがあるが 日付関数のはさすがに無いかもしれないなあ >>169 AUTO_INCREMENTで自動付加された値を取り出す場合、 MySQLの場合「LAST_INSERT_ID()」を使いますが、PostgreSQLの場合は 「curval('targetname')」のように行うようです。 いまはプログラムでDBに合わせてsql文を変えています。(Win環境なのでPostgresSQLは使えません・・・) このあたりも、DBIが吸収してくれますか? SELECT文の実行結果CSV形式のファイルに保存したいのですが コマンドは用意されていますか? 自分で作るのもそう手間ではないのですが・・・。 root権限の無い環境で、DBI/DBDを使いたいのですが、 他の環境でコンパイル済みのものをコピーして パスを通してやれば問題なく動くのでしょうか? webProgじゃあないけど、ここが一番perl DBIの話にふさわしそうなので。 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パッケージのみのバグなんでしょうか・・・? mysql使うならdbimysql使えばいんでないの? >176 ああごめんなさい、それで動いてからのカキコです。 けど、同じODBC接続でもCSEはちゃんとデータとって来れてるし、あれっ?と思って。 DBD::CSVって最新版ではトランザクションは使えるんだっけ? mysqlのバージョンが4.0.22なのですが TIMEDIFF(expr,expr2)みたいなことをしたい場合どうしたらいいでしょうか。 そうしたい場合はperlで得るepoctimeの値を保存するべき? 質問したいのですが、テーブルの中の番号フィールドと名前フィールドをSELECTしてきて、 に番号フィールドのデータ全てを配列@aに格納、名前フィールドのデータを@bに格納するには どう書いたらよいですか?? DBD::SQLiteがアップデートされたのはいいが、またアトリビュート名がガイドラインにそってないよ。 >$dbh->{unicode} = 1; # fetchしたテキストフィールドのutf8flagがオン 命名のガイドラインに従うなら"sqlite_unicode"だろ。 DBI::connect でポスグレに繋いだときに、 わざとホスト名を間違えてエラーを出したのに、 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 がくるのではないのか… >>189 500エラーだけじゃ情報が少なすぎるので、http鯖の エラーログを見るか、 use CGI::Carp qw(fatalsToBrowser); を使うか、自前でconnectをevalの中で実行して$@を 表示してみるなどして、どういうエラーが出てるかを きちんと調べることをお勧めする。 connectでエラーが起きたときに undef が帰ってくることを利用して エラー処理を行おうと思っているのですが、undef が帰ってこなくて悩んでいます。 ですので、エラーの内容は特に何でもいい感じです。 ちなみにエラーの内容は、ホスト名をわざと間違えて実行しているので、 エラーログにももちろん DBI connect(...) failed: could not translate host name "aaaaa" to address: Name or service not known が出ます。 (エラーの内容はユーザ名間違いでもなんでもいいです) 参考にしているサイトやオライリーのPerlDBI本では、 undefを見てエラーチェックする例が書かれていたので… すいません、190に追記です。 eval , $@ を使えば正しくエラー処理できてますが、 my $dbh = DBI::connect() or mySubRoutine(); のようなことがやりたい感じですが、エラー時でも or以降に行ってくれずdieされてる感じです。 >>192 は、 ×190に追記です。 ○191に追記です。 間違いでした。 スレ汚しすいません… >>194 どういう意味でしょうか?? DBI::connect には option 属性がなかったので。 少なくとも手元の環境ではconnect失敗でundefが戻ってきて処理は続くので、 環境やバージョンに依存した何かかね? 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 >>197 ご指摘ありがとうございます! RaiseErrorが有効になっていたので、 無効にしてみたらちゃんとキャッチできました… なにかものすごい勘違いをしていたようです。 RaiseErrorを無効にしないとdieされるから キャッチできないってオチですね。 大変失礼しました。 Class::DBIをつかってOracle9iにつないでいます。 ORA-01000が出るんですが、原因がわかりません。 常に出るわけではなく、なにをきっかけにしているのか ずーっと悩んでいます。 Class::DBIを使った場合、カーソルが開く(もしくは閉じる)タイミングというのは いつになるんでしょうか? なにかヒントのようなものでもよいので お願いします。 windowsでperlからdbi使ってpostgreSQLに接続しようとすると perl command line iteratorが落ちてしまいます。 そしてMicrosoftへ連絡させられる・・・。 どのあたりに原因がありそうですか? postgreにアクセスしないperlプログラムはちゃんと動くし、 pgAdminからならちゃんとpostgreSQLは機能します。 CPAN使ってDBIとDBD-Pgをインストールしました。 windowsでこの環境構築できた人居ますか? >>201 普通に WindowsXP Pro + ActivePerl 5.6.1 + DBI 1.49 + DBD::Pg 1.21 + PostgreSQL 8.1.3 で動いてますが何か? ちなみにDBD::Pgはppmで貰ってきたやつ。 俺は Windows2000 + perl 5.8.7 built for cygwin + DBI 1.50 + DBD::Pg 1.43 + PostgreSQL 8.0.7 だな。 DBI 1.50にしようと思ったら 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以降じゃないからダメ」とインストールさせてもらえないのも結構増えてきた) DBIx::Classの話はここでいい? ある行をselect ... for updateで行ロックかけつつ更新したいんだけどDBICで for updateしつつデータを取得する方法がわからなくて困ってます。 どうすりゃいいの? 自己解決しました。 $rs->search_literal('id = ?) FOR UPDATE; --', $id); search_literalは与えた文字列のまわりを括弧でくるんでくれるので、 FOR UPDATEの部分を外に出すために途中で括弧を閉じ、そのままだと お尻の括弧が余るのでコメントにして無視させるというかなり強引な トリックです。 DBIの話題でいいのかなぁ? データベースはSQLite。 よくある検索画面。1000件中の11〜20件目が2ページに表示されている。 というようなとき、limitやoffsetで取得行数を減らしてパフォーマンスを あげることはよく行われていると思う。 だが検索にマッチした行が全部で何件かを知る必要がある。 limitをつけると、制限した行数しか返ってこないから こういうときSQLを2回発行するしかないんかな? order by してlimitしたりするとき、内部では何行あるか知っていると思うから、 SQL文にlimitつけてても制限されてない行数をしる方法がないかなぁと期待しているんだけど。 >>208 DBIだからこうというよりはSQL一般の話なのでデータベース板の それっぽい質問スレでで聞いたほうが知ってる人に当たる確率が 高いと思われる。 >order by してlimitしたりするとき、内部では何行あるか知っていると思うから、 DBの実装によると思う。 逆に言えば、DBごとに行数を返したり返さなかったりすると思うから、その共通I/FであるDBIでは取得できないと思う。 素直にselect count(*)しなされ。 実装によっては場合によっても違いそうだしな。 ちょうど都合のいいインデックスがあれば 頭からlimit数分順に拾うだけでいいかもしれない わけだし。 時代はDBIx::Class!って事で DBIxでLimit 4,10みたいなのできないんかねー >>214 pagerのことかな。直接limitしたいんだよというときにはかえってめんどくさいが。 あるいはsearch_literalで >>207 とおなじやりかたでlimitもつけられそう。 (試してはいない) DBIx::Class 系で、set_sql する方法きぼん。 compat とかわけわからなす。 スレ違いだったらすみません。DB板から移動してきました。 Perl + Postgresqlのアプリをmysqlに移植しようとしています。 Postgresqlでは複数ステートメントを連結したSQLをDBIで渡して実行できてたのですが、 mysqlでそのまま渡すとSyntax Errorとなってしまいます。 cseというクライアントソフト経由でも同様の症状がありましたが「一括実行」という Pstgresqlでは使ったことのない操作で複数ステートメントを順に実行できました。 Perlで実行するためには何か特殊な設定などが必要でしょうか。 宜しくお願いします。 DBに登録した画像バイナリを読み出して、Content-typeとContent-length指定で ブラウザに表示させることはできたんですが… これ、普通のhtmlと一緒に出す場合はどうするのでしょうか? >>219 httpがわかっていれば出来ない質問だな >220 mhtファイルを自前で生成するとか?(笑) 辿る道のりは人それぞれなのね。俺なんてバイナリ型なんて扱ったことないし。 バイナリ出力するスクリプトの横に別のHTMLを作って、<img src="./hoge.cgi"> なんて書いてみよう。 DBI+MySQLでLIMITにプレースホルダが使えねぇぇぇ。 $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() ; だと×。なして? - Class::DBI - Class::DBI::Sweet - DBIx::Class::Schema お好きなのをどうぞ。 >>223 > $sth = $dbh->prepare( 'SELECT * FROM companion LIMIT $i, 3' ); $sth = $dbh->prepare( "SELECT * FROM companion LIMIT $i, 3" ); じゃないか?「'」 だと$iが展開されないぞ。 > $sth = $dbh->prepare( "SELECT * FROM companion LIMIT $i, 3" ); そんな書き方してると、注入されますよ? いつからか忘れたけどDBD::mysqlがlimitの引数にplaceholder使えなくなったとおもう。 プレースホルダで渡すときにクォートされるからこんなSQLになってる LIMIT '0',3 ってかエラー吐いてるの見ればわかるでしょ? >>226 ギャグで言ってる?$iの汚染チェックするのは当然だろ。 オレは223の解釈が違ってるからレスしただけだ。 そもそも223の最後の例はプレースホルダ使ってないし。 sjisをsjisのまんまMySQLに渡したいんですが、2バイト目が0x5cのマルチバイト文字 ([\x81\x83\x84\x89-\x9F\xE0-\xEA][\x5C])で不具合がおこります。 十十十十 → 十十\十十\ 十と一を足すと十一 → 十と一を足すと十\一 と2文字毎に\マーク(0X5C)が入ってしまいます。 これはDBI内部でのエスケープ時のバグでしょうか? 携帯電話用なのでなるべくSjisを使いたいという前提で、解決法がありましたら教えてください。 >>232 内部処理はUTF-8かEUCでやって出入り口のみでSJISと変換する。 これが一番楽だと思う。内部処理をSJISでやるのはお勧めしない。 どうしてもやりたければ同じような変な現象があとからあとから出て 来るので、それととことん付き合う覚悟でどぞー。 >>233 お返事ありがとうございます。 携帯電話ユーザーなので、当たり前に機種依存文字を使ってきます。 丸囲み数字や、絵文字など。 他文字コードに変換すると極めて都合が悪いのです。。 文字コード変換前にそれぞれ絵文字や機種依存文字をマッピングしてやればいいのかもしれませんが、 その労力も大変なものなので、どうしたものかと >>233 こういうの使うのも面倒なの? http://search.cpan.org/ ~hio/Unicode-Japanese-0.34/Japanese.pm ありゃアンカ間違えた >>235 は>>234 へのレスね >>236 auに対応してないですね。 絵文字のマッピングは途中までやってるので続きやってみようかな。 それと、機種依存文字か。 他にsjisからutf8に変換するときに注意するような文字ってありますかね? Sjisに戻すという事を前提に。 \マークが全角バックスラッシュになるのは確認してるんですが。 Encode-JP-Mobile ってーのは何だか使えそうだが、どうだろう? Encode::from_to( $string, "CP932","UTF8",Encode::FB_XMLCREF); でIBM外字全部処理してくれるんですね。 こりゃ便利だ。。Encode使ってなかったよ(-o-; すでにスレ違いだけどEncode-2.13以降なら「FB_」はいらないらしいよ > Encode 2.13以降ではfrom_toのfromの段階、すなわちdecodeの際にはcheckせずとにかくutf8化し、 > toの段階にあたるencodeの際にcheckを適用するという風にしたのですが、 > その結果、FB_(PERLQQ|HTMLCREF|XMLCREF)のFBが不要になったのです。 http://blog.livedoor.jp/dankogai/archives/50502791.html http://kawa.at.webry.info/200605/article_11.html Perlを触り始めたばかりなので、何がなんだかわかっていません。 DIBを使用したいのですが、以下のエラーが出てしまいます。 【ソース】 1 #!/usr/perl5/bin/perl 2 ## 3 ## 4 require "/u01/app/oracle/OraHome_1/perl/lib/site_perl/5.6.1/i86pc-solaris/Bundle/DBI.pm"; 5 6 @ary = DBI->available_drivers; 7 foreach (@ary){ 8 print $_,"\n"; 9 } 【エラー】 $ /usr/bin/perl test01.cgi Can't locate object method "available_drivers" via package "DBI" (perhaps you forgot to load "DBI"?) at test01.cgi line 6. 【環境】 Solaris9 + Oracle10g(10.1.0.3.0) ご存知の方、ご指導よろしくお願いします。 >>241 つーかなんでuseじゃなくてrequireで読んでるのよ。 (ちゃんとPerlのモジュール用のディレクトリにDBIインストールしろって) #!/usr/perl5/bin/perl use DBI; foreach (DBI->available_drivers('TRUE')){ print "$_\n"; } >>242 レスありがとうございます。 >つーかなんでuseじゃなくてrequireで読んでるのよ。 Oracle10gのインストール時にインストールされた DBI.pm を使いたかったからです。 (以下の3箇所に DBI.pm が存在していました。) A. /u01/app/oracle/OraHome_1/perl/lib/site_perl/5.6.1/Apache/DBI.pm B. /u01/app/oracle/OraHome_1/perl/lib/site_perl/5.6.1/i86pc-solaris/Bundle/DBI.pm C. /u01/app/oracle/OraHome_1/perl/lib/site_perl/5.6.1/i86pc-solaris/DBI.pm >ちゃんとPerlのモジュール用のディレクトリにDBIインストールしろって インストールというのは、どういうものなんでしょうか? ★インストール方法1 @INCに定義されているディレクトリの1つに、上記 B のディレクトリの内容を 全部コピーして実行。結果は、 Can't locate object method "available_drivers" via package "DBI" (perhaps you forgot to load "DBI"?) at test01.cgi line 5. でした。 ※@INCにパスを追加する方法は、わかっておりません。 続き ★インストール方法2 CPAN http://search.cpan.org/ ~timb/DBI-1.51/DBI.pm から DBI-1.51.tar.gz をダウンロード。 gnuの make と gcc をダウンロード&インストール。 http://www.sunfreeware.com/ から libiconv-1.8 をダウンロード&インストール。 makeで失敗。 make: *** [blib/arch/auto/DBI/DBI.so] Error 1 行き詰まりです。 「DBIインストール」は、こんなに複雑なものなのでしょうか? やはり、Solaris9(Intel-32bit) + Oracle10g(10.1.0.3.0)の環境が災いしているとか・・・ >>244 仕事でそんなレベルのことで悩んでるのなら、とっとと辞めればいいのに。 >>244 DBI の問題ではなく、読み込んだモジュールを import していない せいです。use は自動で import しますが、require はしません。 @INC を直接いじるのは最後の手段なので、lib pragma を使い、次の行を を use DBI の前のどこかに入れてください。 use lib '/u01/app/oracle/OraHome_1/perl/lib/site_perl/5.6.1/i86pc-solaris/'; perl は、付属ドキュメントが充実しています。2ch などで質問する前に perldoc を使うようにしてください。 >>246 有難う御座います。 実行してみました。 上手くいっていません。 まだ、設定がいるのでしょうか? 【ソース】 #!/usr/perl5/bin/perl use lib '/u01/app/oracle/OraHome_1/perl/lib/site_perl/5.6.1/i86pc-solaris/'; use DBI; #foreach (DBI->available_drivers('TRUE')){ #print "$_\n"; #} 【結果】 $ perl test01.cgi ld.so.1: perl: 重大なエラー: 再配置エラー: ファイル /u01/app/oracle/OraHome_1/perl/lib/site_perl/5.6.1/i86pc-solaris//auto/DBI/DBI.so: シンボル perl_get_sv: 参照シンボルが見つかりません。 強制終了 >perl は、付属ドキュメントが充実しています。2ch などで質問する前に >perldoc を使うようにしてください。 了解しました。手引き有難う御座います。 >>246 > 重大なエラー: 再配置エラー: ファイル そのDBIじゃなくて素直に http://search.cpan.org/ ~timb/DBI-1.51/ のDBI使おうよ。 恐らく /u01/app/oracle/OraHome_1/以下略 にある方はインストールまたはコンパイルに失敗しているんじゃない? それと同名のモジュールで http://search.cpan.org/ ~timb/ とは別物という可能性もあるでしょ。 インストール方法はREADME読め。 つーか読まなくとも perl Makefile.PL make make test make install とする手順はほぼ全てのモジュールで変わらないっての。 ちなみにPerl 5.6.xだと警告(「5.6系列なんてもうサポートしてねーよ」)と出るからできればPerl 5.8.xにすることが望まれる。 5.6のまま使い続けたいのなら、警告無視してそのままインストールを強行するか、古いバージョンのDBIを落としてインストールすればいい。 > 了解しました。手引き有難う御座います。 了解したのに質問してるしw ごめん。 間違えた。 誤 >>246 正 >>247 >>248 README読みました。 【http://search.cpan.org/ ~timb/DBI-1.39/の結果】 ※perlのバージョンは v5.6.1 built for i86pc-solaris-64int $ make /bin/sh -c true /bin/sh -c true /bin/sh -c true cc -c -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -xO3 -xdepend -DVERSION=\"1.39\" -DXS_VERSION=\" 1.39\" -KPIC -I/usr/perl5/5.6.1/lib/i86pc-solaris-64int/CORE -DDBI_NO_THREADS Perl.c cc: unrecognized option `-KPIC' cc: language depend not recognized cc: Perl.c: linker input file unused because linking not done /usr/bin/perl -I/usr/perl5/5.6.1/lib/i86pc-solaris-64int -I/usr/perl5/5.6.1/lib /usr/perl5/5.6.1/lib /ExtUtils/xsubpp -typemap /usr/perl5/5.6.1/lib/ExtUtils/typemap -typemap typemap DBI.xs > DBI.xsc & & mv DBI.xsc DBI.c cc -c -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -xO3 -xdepend -DVERSION=\"1.39\" -DXS_VERSION=\" 1.39\" -KPIC -I/usr/perl5/5.6.1/lib/i86pc-solaris-64int/CORE -DDBI_NO_THREADS DBI.c cc: unrecognized option `-KPIC' cc: language depend not recognized cc: DBI.c: linker input file unused because linking not done rm -f blib/arch/auto/DBI/DBI.so LD_RUN_PATH="" cc -G DBI.o -o blib/arch/auto/DBI/DBI.so cc: DBI.o: No such file or directory cc: no input files make: *** [blib/arch/auto/DBI/DBI.so] Error 1 $ $ gcc -v Reading specs from /usr/local/lib/gcc/i386-pc-solaris2.9/3.4.2/specs Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls Thread model: posix gcc version 3.4.2 DBI-1.39 27 Nov 2003 perl敷居高い。 (゚∀゚)アヒャ! その程度もなんとかできない程度のスキルならインテル版Solaris使うのは ちと荷が重いんじゃないかな... 仕事ならご愁傷様。 Solaris10のフルインストールでインストールされるgccとmakeを使っても結果は同じでした。 Solaris + Intel + 32bitの場合のOracleの選択肢は、Solaris9 + Oracle10gの 組み合わせしかないし、Solaris10のZFSを使いたいと思っているので、 素直にphp + MySQLを使う方がストレートのような気がしてきました。 ちゃんとした技術のあるところへ再委託したほうがいいよ。 で、出来た時間でじっくりお勉強。 まあまあ、よくハマル話なんで、愚颶ると結構出てくることだから。 ただ、エラーメッセージちゃんと読まずに問題を切り分けられないからって、 DBI に文句言うのはメ。 ヒント: gcc の -fPIC に当るのが SUN謹製 cc の -KPIC。Perl は寂しがり屋 だから自分とおそろいのコンパイラが好き。 皆様ありがとうございました。 申し訳ないのですが php + MySQL で問題無く構築できました。 ッッッッッッッッッッッッッッッッッッッッ〜〜〜!!! ば・・・ばかな! DBD-Pgをインスコできねぇ・・・ググっても該当するものがでてこねぇ マジやべぇか(ry DBD-Pg-1.49のmakeで下記の警告が出ます。 ご教授おねがいします。 ----------------------------- dbdimp.c: In function 'dbd_bind_ph': dbdimp.c:1656: 警告: value computed is not used quote.c: In function 'quote_string': quote.c:44: 警告: value computed is not used quote.c: In function 'quote_geom': quote.c:79: 警告: value computed is not used quote.c: In function 'quote_path': quote.c:108: 警告: value computed is not used quote.c: In function 'quote_circle': quote.c:137: 警告: value computed is not used quote.c: In function 'quote_bytea': quote.c:174: 警告: value computed is not used quote.c: In function 'dequote_bytea': quote.c:329: 警告: value computed is not used ---------------------------------------- PostgoreSQL 8.1.4をインスコして起動済みです。 DBI-1.51をインスコ ↓工程 su - postgres export POSTGRES_INCLUDE=/usr/local/pgsql/include export POSTGRES_LIB=/usr/local/pgsql/lib perl Makefile.PL make >>262 レスアザース 一通りmake installをして下記トレース(****はふせたいヶ所)を実行してみました。 ---------------------------------------------- #!/usr/bin/perl use DBI; use constant DBNAME => 'DBI:Pg:dbname=****'; use constant DBUSER => 'postgres'; use constant DBPASS => '****'; DBI->trace( 2, '/home/postgres/public_html/dbi_trace.log'); DBI->connect( DBNAME, DBUSER, DBPASS, { AutoCommit => 0 }); print "Content-Type: text/plain\n\n"; print $DBI::errstr? $_: 'Done'; ---------------------------------------------- 結果(dbi_trace.log) -------------------------------------------------- DBI 1.51-ithread default trace level set to 0x0/2 (pid 5346) -> DBI->connect(DBI:Pg:dbname=tottoDB, postgres, ****, HASH(0x8eabc28)) -> DBI->install_driver(Pg) for linux perl=5.008008 pid=5346 ruid=0 euid=0 -- DBI::END -------------------------------------------------- DBD::PgのVersionなど詳細をはきだす前にENDされています。 ふせたいヶ所が結果でバッチリ見えてるとか オレっておちゃめw ぐっすり睡眠をとってからmake uninstallで指定されているファイルをrm -fして 再インスコしたらDBD::Pgが動作しました。 /usr/local/pgsql/lib/libpq.so.4 のシンボリックリンクを /usr/lib/libpq.so.4 に作った事が吉とでたようです。 ちなみに>262の言う通り警告は問題なかったようです。 環境は、mod-perl+MySQL+qmail+vpopmailで、vpopmailのユーザー管理はMySQLにしています。 perlでメールアカウントを作成するにはどうしたらよいでしょうか? やりたい事は、セカンドメールサービスのようなもので、 登録したユーザー同士でセカンドメールを与えるという物です。 user_a@hotmail.comにid_a@mydomain.com user_b@hogehoge.comにid_b@mydomain.comを与え、 user_a@hotmail.comからid_b@mydomain.comに送られたメールを id_a@mydomain.comからuser_b@hogehoge.comに転送するような感じです。 現在はSubjectに送りたい方のidを入力してもらって、recept@mydomain.comを窓口にして転送してます。 もっと簡易なシステムを作りたくご相談します。 こういう場合、メールアカウントを作る必要もないのでしょうか? スマソ。DBICについての質問をココでさせて貰っても良いだろうか CatalystでWebアプリを作っていて、思いっきりモデルで躓いている CREATE TABLE TblDiary( parano int4 order_no int4 belong_dno int4 have_illustno int4 PRIMARY KEY(parano)); CREATE TABLE TblIllust( illustno int4 illust_name text, PRIMARY KEY(illustno)); 上記の「TblDiary」と「TblIllust」という2つのテーブルがあって、 TblDiary.have_illustnoとTblIllust.illustnoをJOINTさせたい このとき my $table = $c->model('DBIC::TblDiary'); $table->has_one('illust_bind' => 'Test::Model::DBIC::TblIllust', 'illustno'); my $records = $table->search( {belong_dno => $dno}, {order_by => 'order_no'}, {prefetch => ['illust_bind']} ); と書いているんだが、これだとTblDiary.paranoとTblIllust.illustnoがJOINTしてしまうんだ・・・ (一応、それ以外のところは思っているとおりにデータが取れている) これを、本来望んでいるTblDiary.have_illustnoとTblIllust.illustnoの JOINTにするにはどうすれば良いのか、誰か教授して貰えないだろうか あ〜、うまくインデントできなかった・・・ 見辛い文体で申し訳ないorz 周り見ていると、質問者はみんな丁寧語だ・・・ こちらもスマンかった とりあえず、DBICについてはスレ違いかもしれないので 初心者板でも行ってきます 【初心者】 λ...... >>271 レスありがとうございます。 えっと、申し訳ないですが、そこはすでに拝見させて貰いました・・・ (かなり詳しく書かれており、非常に重宝させて頂いています) リレーションですが、モデルのファイルに設定を書き込まずに Catalystのコントローラーにて書きたい点と、 TblDiaryが主キーのカラムじゃない点で頭を悩ませています 説明不足で申し訳ありませんでした。 かなりググったのですが、探し方が足りないのか 未だにネットでは見つからずにいますorz 実際にCatalystを使っておられて、CDBIを使用されている方は おられるでしょうか? う〜ん、すみません 説明がヘタで申し訳ないです・・・ 主キーではないTblDiary.have_illustnoと連結させたいので、 このhave_illustnoというカラムを何らかの方法で illustnoというカラムとリレーション指定を行いたいです (このままでは、主キーのカラムであるTblDiary.paranoと連結してしまいますので) 希望するhave_illustnoへと連結できるよう、どのようにコントローラーに 指示を送れば良いのかが分からないです。 >>272 CDBIを使用されて(×) DBICを使用されて(○) ・・・間違えました リレーションの設定はモデルでやれってば。 コントローラでやる理由は? >>275 レスありがとうございます。 コントローラに記述する理由ですが、今後テーブルの個数が大きく増減する可能性があり、 モデルを全削除して、再度CatalystのヘルパースクリプトでDBの構造から モデルファイルを自動作成するかもしれないからです。 ヘルパースクリプトを使わず、変更の度に対応するCatalystのモデルファイルを 手動で追加・削除したりしても良いのですが、どうしてもミスがありますので・・・ こちらは希望ですので、モデルに書くしか実現できないようでしたら諦めたいと思います。 ただ、モデルに書いた場合でも片方のテーブルが主キー以外のカラムと連結できず、 ハマり状態から抜けられずにいます。 モデルにリレーションを書く方法も平行して試行錯誤してみます。 あっちにも書いたし、もしかしたら引用ミスかもしれないけど こうじゃなくて my $records = $table->search( {belong_dno => $dno}, {order_by => 'order_no'}, {prefetch => ['illust_bind']} ); こうじゃないのかな my $records = $table->search( { belong_dno => $dno }, { order_by => 'order_no', prefetch => [ 'illust_bind' ] } ); 2chは半角スペースが詰められちゃうから 書き込むときは全角でインデントするといいよ >>276 それなら DBIC::Schema 使えばいいんじゃないかな。 >>276 package MySchemaClass; use base qw/DBIx::Class/; # 自動生成 package MyController; use MySchemaClass; MySchemaClass->belongs_to(...); >>277 >>278 >>279 レスを頂きましてありがとうございます。 >>277 ご教授ありがとうございました。 prefetchはorder_byと同じ第2引数に記述するのですね。 今まで第3引数として書いても動作していたのは、 DBICの方で良きに計らってくれたのかもしれません・・・ ただちに直させて頂きました。 インデントの件も御指摘ありがとうございます。 以後気をつけて書き込みさせて頂きます。 >>278 >>279 なるほど、DBIC::Schemaを使用すれば、問題とならないのですね。 Catalystを使う上でもDBIC::Schemaが推奨させているようですので、 私もこちらを非常に使いたいのですが、未熟なため、 DBIC::Schemaを使用してCatalystのヘルパースクリプトを立ち上げられずにいます。 こちらのサイトを参考にして試してみたのですが http://en.yummy.stripper.jp/?eid=362958 >script\lc_create.pl model DBIC DBIC::Schema Lc::Schema create=static DBI:Pg:mydb user pass とプロンプトからヘルパースクリプトを起動させると >Can't locate object method "use" via package "DBIx::Class::Schema::Loader" (perhaps you forgot to load "D BIx::Class::Schema::Loader"?) 『もしかしてDBIx::Class::Schema::Loaderをロードし忘れているんじゃないか?』と指摘されてしまいました。 該当場所まで言って、useでロードして見るものの、 >Can't locate object method "use" via package "DBIx::Class::Schema::Loader" うしろの( )指摘がなくなっただけでして、現在はこちらで立ち止まっている状態です。 推奨されるDBIC::Schemaには切り替えたいですので、今から引き続き挑戦して参ります。 (何か大ポカをやらかしていそうな気がします・・・) 非常につまらないことが原因で本当に申し訳ないのですが・・・orz >>268 の件、ようやく望む通りの動きをするコーティングができました。 my $table = $c->model('DBIC::TblDiary'); $table->belongs_to(illust_bind => 'Test::Model::DBIC::TblIllust', 'have_illustno'); my $records = $table->search( { belong_dno => $dno }, { order_by => 'order_no', prefetch => ['illust_bind'] } ); 「belongs_to」にて最後に繋げたい、主キーではないカラム名を指示するだけだったようです。 お見苦しい質問をいたしまして、本当に申し訳ございませんでした。 レスを頂いた皆様に、心より御礼申し上げます。 おっさんさ、いいかげんにしたほうがいいとおもうよ。 CatalystでDBIC使ってフォームからの値を一発でアップデート、クリエイトできますか? 以下やってみたけど、エラーとなりまうす my $result = $c->form; my $userdata = $c->model('HOGE')->find(uid => $uid); $userdata->update($result); あほなのでフォームの値をいちいちハッシュに入れてからじゃないとうまくできないです。 良い方法あったらおしえてください。 ちょっと伝わらなかったかもしれません。 ごめんなさい。 $userdata->update($result); これ$resultは$c->formなんですが、これだとエラーになるんですよ。 DBIx::Class::InflateColumn::update(): No such column _records いちいち $c->req->param('hoge1')をハッシュに入れて、update(\%hoges)とすればうまくいくんですけど いちいちハッシュにいれなくても良い方法ないですかね。 >>289 $c->formはCatalyst::RequestオブジェクトだからいきなりDBICのupdateに わたしてもそりゃだめだろう。渡すとすれば$c->form->paramsじゃないか? チェックはちゃんとしてあるのが前提だけどな。 $c->form->paramsはだめでした。 http://search.cpan.org/ ~jrobinson/DBIx-Class-WebForm-0.02/lib/DBIx/Class/WebForm.pm これためしてみましたが、CatalystのDBICに __PACKAGE__=>config(additional_base_classes => 'DBIx::Class::WebForm'); 入れてみたけど $userdata->update_from_form($result); で Can't locate object method "update_from_form" とでてしまう... >>291 $c->form->paramsが返すハッシュリファレンスの中身は期待しているもの だったのか確認したのか? update_from_formはクラスメソッド。使い方がマニュアルと違うじゃん。 DBI使ってtextファイルの中身をpostgresのtext型のフィールドに突っ込みたいんですが、 ファイルの中身は変数に一度突っ込んでから $sth->execut($text); する方法しかないのでしょうか? メモリの使用量が心配なんですが、他に良い方法はありませんか? メモリが心配になるくらいでかいテキスト、突っ込んだあと どうやって利用するんだ? 取り出すときもメモリの心配するのか? $st = $db->prepare("SELECT student_id,question_update from $tbname; select count(question_update) from results;select count(student_id) from results;"); $res = $st->execute; while(@res = $st->fetchrow) { print <<ROW; <tr> <td> $res[0] </td> <td> $res[1] </td> </tr> ROW } print "$res[2]$res[3]\n"; DBIについての知識が乏しいのですが、締め切りが近いため、無理やりにプログラムを 作っている状態です。超初心者ですが、よろしくお願いします。 上記のように、$st = $db->prepare()の中に複数のMySQL文を入れることは 可能でしょうか? また、違う点でもご指摘があればよろしくお願いします。 postgresqlですが、pg_enable_utf8してもフィールド名にはUTF8フラグが立たないようです。 fetchrowにラッパーかます以外、簡単な解決策はないでしょうか。 Apacheのバージョン Perlのバージョン DBIのバージョン DBD::MySQL(PG,Oracle)のバージョン MySQL(PostgreSQL,Oracle)データベースのバージョン 使える組み合わせの一覧表ってどこかにありませんか? 使えない組み合わせなんてあんの?あんまり経験したことないんだが。 PerlからMySQLの.から始まる独自コマンドを実行したいのですが、どのようにしたら良いのでしょうか。以下のコードでやると(near ".": syntax error(1) at dbdimp.c line 271)とエラーが出ます。 use DBI; $DBName="TestDB.db"; $hDB = DBI->connect( "dbi:SQLite:dbname=$DBName","","",{PrintError=>0} ); if(!$hDB){ print "$DBI::errstr ¥n"; exit; } $sql =".table;"; $hst = $hDB->do($sql); if(!$hst){ print $hDB->errstr . "¥n"; exit; } print $hst; $hDB->disconnect; sqliteのドットから始まるコマンドのAPIはDBIにないと思う テーブル見るだけならsqlite_masterというマスターテーブル?に入ってるから $dbh->prepare('SELECT * FROM sqlite_master") とかあとはスクリプトの中からsqliteを直接実行するしかないんじゃないかな >>305 即答ありがとうございます。sqlite_masterとても参考になりました。 sqlite使ってる人いる? トランザクションでエラーでまくりなんだけど・・・ DBD::SQLite 1.3 MySQLやPerlのDBIのモジュールを組み込んだりって大変じゃないのか。 調べたりすることが多くて、エラーが出てばっかりとかで、時間は浪費するし、 疲れる。困難の連続なんだが。 DBの接続を実現させるだけでも大変。 でも他人は俺とは違い、難なくクリアしてるんか。頭が良くて、要領もいいのか。 どうやって解決してるんだ。 妥当な入れ物を作って、その入れ物に依存したコードを書いたほうがメリットが大きいだろ。 データの永続化としては、CSVもどきやCSV, YAML, Storable, DBMとかあるとおもうけど DBIでRDBMSが一番手堅くね? もつろんORMはDBIx::Classなどを御自由に DBIx::Classの話題でないな。 覚えて慣れるまで大変だわ。 I think these people want to hear my logic. , >>312 覚えるの大変な割りに使い勝手わりーよ ちょっと気の利いたことすると、すぐに括弧だらけになっちまう 気を利かせなけりゃDBIx::Simpleで充分だし DBI::mysqlを使用しているのですが、updateをwhileで2万回回して行っている 箇所があります。 うろ覚えではあるのですが、DBIで実装されている機能側でキャッシュして これを一括で実行する方法があったような気がするのですが、ぐぐっても 出てこなかったので、幻ですかね。。 >>312 ,314 そんなあなたたちに DBIx::Skinny DBIx::Skinny のCPAN上の最新バージョンが 0.0721 でなんかちょっとやだ。いや別にいいんだけど。 >>317 「スキニーパンツ見てオナニー」と覚えよう IIS <-> Perl <-> OCDB <-> Access(mdb) on WinXP という環境なんですが mdb上のメモ型フィールドのデータをPerl上で "SELECT memo FROM sampletable" として抽出しようとすると DBD::ODBC::st fetch failed: [Microsoft][ODBC Microsoft Access Driver]文字列データの右側が切り捨てられました。 列番号 1 (Title) (SQL-01004) at C:\yyy\xxx\www\test.pl line 28. というエラーが出て、配列にデータが格納されません。 メモ型のみで、テキスト型フィールドのデータはきちんと抽出され、配列に格納されます。 調べてみたところ、メモ型フィールドはSELECTで抽出できないという文章を目にしたのですが もしそうなのであれば、255Byte以上の文字列はどのようにDBへ出し入れすればよいのでしょうか? ちなみに、Access上のSQLクエリでSELECTにて抽出した場合には、メモ型フィールドもきちんと抽出されてきます。 同じ命令をOCDB経由で投げると上記エラーが出てきます。 どなたが、救いの手を・・・ メモ型でもフィールド内が40文字以下ならば、抽出可能なことが判明。 それを超えるとエラーしてしまう。 テキスト型でも、フィールドサイズが255文字までなので、それ以下しか扱えないということになってしまいます。 相変わらず、メモ型の動作が想定外な為、自己解決ならず。 テーブル名にプレースホルダ表記は使えませんか? $stl = $dbh->prepare("CREATE TABLE ? ( ? char(2) )"); $stl->execute($table_name, $key_name); 文法エラー: CREATE TABLE 'my_table' ( 'my_key' char(2) ) ほんとうは CREATE TABLE my_table ( my_key char(2) ) じゃなきゃだめ ∧_∧ ( ・∀・) | | ガガッ と ) | | Y /ノ .人 / ) .人 < >_∧∩ _/し' < >_∧∩`Д´)/ (_フ彡 V`Д´)/ / ←>>79 / ←>>94 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 GF0GY9E5D8 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる