トップページ⇒php
933コメント644KB

PHP + PostgreSQL

■ このスレッドは過去ログ倉庫に格納されています
0001りさあ NGNG
語りません?
0309nobodyさん02/10/03 22:37ID:yBxgrv2T
>>282
バキュームしれ。
7.2.1使って12万レコード/日くらいのトランザクションがあるけど、
結構ディスク占有率がふくれる(溜めるだけではないため)。
数万レコードでも更新が多いならお薦めだ > 使っているdata/base
#ちなみに vacuum full 実行10分ちょい > 漏れの仕事環境

vacuume or vacuume full は頼りになるぞ。



そんな漏れん家のサーバは1回/半年で十分だ。数秒で終わる(w
031030702/10/04 14:40ID:qOvfKv6+
結果報告〜。
つながりました!Apacheは入れなくてもよかったです。
これまでCygwinを手動で起動して、その上でipc-daemonをサービス起動して
次にpg_ctlでPostmasterを起動して・・・とやってたんですが
cygrunsrvというコマンドでPostmasterもサービス登録する手順をみつけ
やってみたところ、突然つながりました!
接続は以下のように行いました。ユーザも何もかも指定しました(笑)
$con = pg_connect("dbname=testdb host=localhost user=test_user password=test_user");

Postmasterの登録に使用したコマンドは以下のものです(本当は1行です)

$ cygrunsrv --install PostgreSQL
--path /usr/bin/postmaster
--args "-D /usr/share/postgresql/data -i"
--dep ipc-daemon
--termsig INT
--user postgres
--shutdown

これで、試験サーバを起動してから一々ipc-daemon+Postmasterを手動で
起動する手間もかかりませんし、いい感じです。
ただ・・・Postmasterのみ再起動する方法がわからないんですよね。
pg_hba.confとかその辺を更新した後、サーバごと再起動しないと駄目という
実に非現実的な環境になってしまいました(爆)

でもまぁ、大きく一歩前進です。多分何か方法があるんでしょうし
設定とかあるのかもしれません。調べていくことにします。

多謝多謝、多謝です〜!
0311nobodyさん02/10/06 21:27ID:Y+aKD2A2
すっごい初歩的な質問ぽいですが…かきこします。
xreaでPostgreSQLつかってるんですが

$hst = "localhost";
$db = "ユーザID";
$us = "ユーザID";
$pass = "パスワード";

$conn = pg_connect("host=$hst dbname=$db user=$us password=$pass") or die("接続エラー");

ってやると
Warning: pg_connect() unable to connect to PostgreSQL server: PQconnectPoll() -- connect() failed:
Connection refused Is the postmaster running (with -i) at 'localhost' and accepting connections on TCP/IP port 5432?
っていわれちゃうんだけど、解決方法わからないですか?

自分のパソコン上でやるとできるのですががが。
0312nobodyさん02/10/07 01:33ID:hvZZAVT1
>311
まんまやん!
-i と一緒に走らせろよ。

pg_ctl stop
pg_ctl start -o "-i"

だな
031331202/10/07 01:37ID:hvZZAVT1
追加
DBが別サーバなら pg_hba.conf の一番下辺りの trust あたりを見る。
んで、適時追加する(アクセスするサーバへの許可)。
↑の起動オプションの追加やconfの変更が出来ないんならわからん!
0314nobodyさん02/10/07 08:25ID:tYSAfVj4
つーか、ApacheとPostgreSQLが同じマシンで走ってるなら、
ふつーはUNIXドメインソケットで接続するんちゃうやろか。
-i オプションつけずに動かして。

なので、「host=$hst」つーのはいらないのでは?
031531202/10/08 00:18ID:OGtZEEu6
>>314
つ〜か、「自分のパソコン上でやるとできるのですががが。」だそ?
隣のパソコンにつなごうとしてうまくいかないのでは? と思うぞ...ふつ〜は。

っで、隣のパソコンから己(311)のIPがipfwとかipchainsとかから
deny|dropされていない事は確かだろうな?(w IPだけじゃなくportも...

そんなんされてたら、どうにもできんが(www
031631202/10/08 00:19ID:OGtZEEu6
をぉ!
隣のパソコン≠localhost ぢゃないか!!(w

逝ってくる...
0317nobodyさん02/10/09 01:18ID:LBei1JgW
質問です。
PHPから、postgresへデータを書き込む時は、どうしたらよいのでしょうか?
今、POSTされたデータを使って、
こんな感じの関数を使って、文字をEUCにして、DBに入れてます
でも、うまくいかないんです......動くんだけど
特定の文字の時、
ここから-----------------
――――――――――――――――――――――――――――――――0-5/10―
★GAME
-------------ここまで
を入れると、0移行がきれてしまって、DBに入るんです...
0移行もいれたい!でも、うまくいかない...
なぜ?

Function beauty($sSQL)
{
//文字をEUCにして綺麗にして
$sSQL=trim(mb_convert_encoding($sSQL,"EUC","SJIS"));
$sSQL=mb_convert_kana($sSQL);
//改行キーを綺麗にして
$sSQL=str_replace("\r\n", "\n",$sSQL);
$sSQL=str_replace("\r", "\n",$sSQL);
$sSQL=ereg_replace("^(\n)+|(\n)+$","",$sSQL);
//スラッシュを綺麗にして
$sSQL=addslashes(stripslashes(stripslashes($sSQL)));
//実行
return $sSQL;
}
0318nobodyさん02/10/09 02:48ID:uMeBQ3Ig
カラムの型なんでしょう?
0319nobodyさん02/10/09 07:54ID:???
つーか、なぜ $sSQL を加工する度に echo して調べないのかと小一時間(略
0320nobodyさん02/10/16 17:38ID:???
Apache 1.3.22 + PHP 4.2.3 + PostgreSQL 7.2.1 で、
phpPgAdmin 2.4.2 を動かそうとしたんですが、フォーム入力で
なぜか先頭の4文字分が消えてしまってSQLクエリが組み立てられず
エラーになってしまいます。

PHPは --enable-mbstring --enable-mbstr-enc-trans
--enable-mbregex で configure してあり、通常のPHPでのフォーム入力
受け渡しでは問題ないのですが、phpPgAdminのPHPスクリプトが
何か特殊なことをしているのでしょうか?
0321質問ageです02/10/22 10:45ID:38ZRylkG
WEB データベースでは 1ページ毎に

 $db = DB::connect();
 $res = $db->query();
 $db->disconnect();

とするのが普通なのでしょうか?
DB オブジェクト $db をグローバル変数として
他のページでアクセスする方法はあるのでしょうか。
0322nobodyさん02/10/22 10:47ID:???
> とするのが普通なのでしょうか?
普通。けど、ココはPHPのスレ。
0323nobodyさん02/10/22 11:08ID:???
>>322
ええ。PHPスレと知ってて質問しています。
PHP-4.2.2 を使用してます。
PHPでグローバル変数は扱えるのかな? と思って質問しました。

現在、最初に postgres の user、password を入力させて
それを各ページに POST して使い回して connect しているんですが
みなさん、このようにして使っているのでしょうか。
0324nobodyさん02/10/22 12:38ID:4eylDja6
>>323
session利用して保持すれば?
0325nobodyさん02/10/22 15:18ID:???
pgpconnect?
032632102/10/22 16:15ID:???
>>324
そうですね。
各ページで connect を行う場合はそうします。

ただ、DBオブジェクト(今回は Class のオブジェクト)を
グローバル化出来れば便利(早い) だと感じたのですが、
皆さんそのようには作られてないようで...
何か、問題あるのかな?
もうちょっと、色々勉強してみます。
0327nobodyさん02/10/22 16:43ID:???
>>321
>>325が自信なさげにつぶやいてるけど
http://www.php.net/manual/ja/features.persistent-connections.php
じゃ駄目なのかと?
032832102/10/22 17:21ID:???
>>327
ごめんです。
別に無視していた訳ではないです。>>325 さん。

今 Class と PEAR を使って色々勉強中でして、
「こんな風に出来ないものか?」と試行錯誤してます。
pg_pconnect は DB::connect( $dsn, TRUE ) で実現
出来るようです。
色々試してみたいと思います。
0329nobodyさん02/10/22 20:50ID:bCdHvFBv
>>326
DBへの接続で、パーシステントな香具師が居たかと...
「永続的接続」だっけか?

ただし、トランザクションエラーでcommitもrollbackもやってなくて
ロック状態に陥る罠。

つ〜か、↑は、デバッグ時にはまった場合の話ね。
きれいになったコードでは問題ないはずだよ。
0330教えて君02/10/30 20:04ID:???
上の永続的とかは関係なくて、
最初にconnectしてから
"begin"を宣言しておいた後、
放置してPHP終了した場合って、
"commit"しなかったんだから"rollback"しなくても良いんですよね?
pg_closeは省略できるらしいし。
どうなの?
033133002/10/30 20:05ID:???
要するに"rollback"も省略できるかってことです。
0332nobodyさん02/10/30 20:11ID:CX80yU9D
どこが2重カキコなんじゃボケェ!
2重カキコじゃないってば!!>ERRORさん

rollbackは今までの作業を捨ててその後で新しく作業するのに使うんですよね?
取消で終了するなら言わなくてもいいっすよね?
033333002/10/30 20:12ID:CX80yU9D
>>332
俺です(鬱)
033433002/10/30 20:20ID:CX80yU9D
http://php.lamphost.net/manual/ja/print/ref.pgsql.php
> BEGINで始まり、 そのトランザクションが有効な場合はCOMMITまたは ENDで終わります。
> トランザクションが失敗した場合、 そのトランザクションはROLLBACKまたは ABORTにより閉じる必要があります。
> ラージオブジェクトリソースを閉じる前に接続リソースを閉じないように して下さい。
エラーでこけたらどうなるんすか?
033532902/10/30 21:02ID:6KbHJvYg
>334さんへ

そのつもりで漏れも
>ただし、トランザクションエラーでcommitもrollbackもやってなくて
>ロック状態に陥る罠。

つ〜て書いてやった訳なんだが、
「早い」事だけを求めてトランザクションのなんたるかを
全く判っていない >>330 には、無駄だったんだと改めてわかったよ。



「永続的接続(パーシステント・コネクト)」と「トランザクション」の共存くらい
勉強&理解して欲しいよなぁ...

Oracleだろうが、DB2だb�、が、MySQLだろうが、PostgeSQLだろうが、
何れは陥る罠だぞ。


漏れは無視していいが、「永続的接続」と「トランザクション処理」を
もう一度根っこから調べてくれ(;´Д`) >> 330

頼む!
0336山崎渉03/01/15 13:47ID:???
(^^)
0337nobodyさん03/01/18 03:13ID:bdZI9lM1
RedHat8.0を入れました。
PHPとPostgreSQLの接続がうまくいきません。
PHPの動作確認はOKでした。
PostgreSQLの方もcreateuserで作成したuserにてpsqlを行えます。

どこかのHPを参考にしてnobodyのユーザーを作り
テスト用のphpをたたくと

Warning: pg_connect() unable to connect to PostgreSQL server: FATAL 1: IDENT authentication failed for user "ifuku" in /home/test/public_html/test.php on line 14

といったメッセージがでます。
php.iniかpg_hba.confの設定をしないといけないのかな?と思いましたが、
なにか参考になる話を聞かせてくれませんか?
033833703/01/18 03:15ID:bdZI9lM1
エラーメッセージのうち user の箇所は nobody でやったりと
他のuserを使ったりはしています。
0339nobodyさん03/01/18 03:35ID:???
>>337
pg_hba.confだろ。
034033703/01/18 03:49ID:???
>>339

そうですか
調べてみます。
ありがとうございました。
0341nobodyさん03/02/26 18:10ID:???
どうしても2カラムで1キーになるテーブルが多いのですが、

a 102
b 2003
aとbでキー

そういう場合は

c 1002-2003
というカラムを作った方がいいですか?
0342nobodyさん03/02/28 12:52ID:Gr9BwE/o
>>351
勉強し直してきてください
0343nobodyさん03/02/28 19:20ID:qSGW/gfl

    ☆^〜^★【新着情報追加】
   http://sagatoku.fc2web.com/
  あなたの探し物こちらで見つかります
0344nobodyさん03/03/07 14:00ID:ZFWCWq3y
PostgreSQL 7.2.3からPostgreSQL7.3.2に変更したところ、
lo_unlinkを使用する箇所でエラーと言われました。
もちろん使用しなければエラーと言われません。
動作的に使用しなくても問題はないように思えます。

同じ症状になった人居ますか?

「環境」
Red Hat Linux 7.2
PostgreSQL7.3.2
php-4.2.3
apache_1.3.27


0345山崎渉03/03/13 17:07ID:???
(^^)
0346nobodyさん03/03/17 18:15ID:RRSo0s2u
新しく更新されたデータから10件のデータをテーブルから
引っ張ってくる場合、
SELECT * FROM テーブル名 LIMIT 10 OFFSET (最終行数 - 10)
になると思うんすけど、この最終行数ってどうやって求めるのか?

$sql = "SELECT * FROM テーブル名";
$db = pg_exec($sql);
$maxnum = pg_numrows($db);
で、いの?

いや、ダメだろうなぁ。なんかもったいないし?
0347nobodyさん03/03/17 18:57ID:UoxJY4S2
>>346
昇順になってるカラムはないの。
あればそのカラムで逆順にソートして最初の10行を取得する。
0348nobodyさん03/03/17 19:34ID:RRSo0s2u
>昇順になってるカラムはないの。
あります。

>あればそのカラムで逆順にソートして最初の10行を取得する。
なるほどぉ。。。。と言いつつ良くわかってない初心者です。
ORDER BYっての使うのか?。

要はページに最新のデータから10件ずつ表示させていくヤツが
作りたいのです。
0349346/34803/03/17 20:14ID:RRSo0s2u
出来ますた。
SELECT * FROM テーブル名 ORDER BY (昇順カラム) DESC LIMIT 10 OFFSET 0
ですね。サンクスです。
035034603/03/18 12:18ID:frl1VUIP
でも、テーブルの総行数を調べたい事ってあると思うんだけど
そん時は莫大なメモリを食いそうな(あくまで漏れの稚拙なイ
メージなんだけど)

$sql = "SELECT * FROM テーブル名";
$db = pg_exec($sql);
$maxnum = pg_numrows($db);

なんて事をせにゃならんのだろうか?

あと、JOINってどんな時に使うの?
0351nobodyさん03/03/18 12:30ID:???
>>350
count() 使え。
SQL の基礎について解説した本か、シーラカンス本買った方が良いよ。
035234603/03/18 14:44ID:frl1VUIP
>>351
サンクスでし。
SELECT COUNT(カラム名) FROM テーブル名
でしね。できますた。
シーラカンス本もマンモス本も持ってます。しかし、まだ敷居が
高すぎます。COUNTについて書いてあるのなんて1ページのほんの
少しでし。

JOINわかんねぇ。つまりテーブルを結合しる・・・と。
ブツブツ・・・。
0353nobodyさん03/03/18 16:07ID:iRf6zAa0
足が短いと、どんな敷居も高く見える
035434603/03/18 17:11ID:???
>>353
なるほど。うまい。

『SQL Webデータベース/独習テキスト完全図解』\2800-すばる舎を
買ってきますた。出なおします。
0355nobodyさん03/03/22 15:32ID:???
こんちわっす、2ch学園web板幼稚園の質問ですけど
教えて下さい。たのんまっす!
no int, hougaku varchar
テーブル名 hoge
no|hougaku
--|------
10|higasi
20|nisi
30|minami
40|kita
こんなテーブルがあったとします。
$houi = "kita"←仮にテーブルにある文字を設定します。
$sql = "select hougaku from hoge where hougaku = 'houi' ;";
$result = pg_query($sql) ;
if num_rows($result) !=1{
print ("そんな方角はありません。") ;
}
ここまで、$houi に代入された文字がテーブルに有るか無いか分かると思います
もしここで正しく$houiにkitaという文字がセットされたとしたら
noの40という数字が導きたいのだがどうしたらいいかわかりません、
続きのプログラムはどう書いていいのか分かりません、教えて下さい。
0356gn355my003/03/22 15:47ID:???
select no,hougaku from 〜
じゃダメなん?
0357nobodyさん03/03/22 15:59ID:jxh1CrBX
こんな過疎スレをsageで質問しても気付く人そういねぇんじゃぁ。

とりあえず、$が抜けている。
$sql = "select hougaku from hoge where hougaku = '$houi' ;";
で、noも取得するなら、
$sql = "select no,hougaku from hoge where hougaku = '$houi' ;";

あとは、
$result = pg_query($sql) ;
if num_rows($result) !=1{
print ("そんな方角はありません。") ;
}else{
$arr=pg_fetch_array($result);
echo $arr["no"];
となる。

その後、何をやりたいのかわからんので、適当に追加したのだが、
これだけのことなら無駄が多いよ。

0358357 ◆Kiss.FX29M 03/03/22 16:02ID:???
うひゃ、ageてもた。

>>356
noの取得が目的なら、
select no from 〜
で、いいよねぇ。
0359nobodyさん03/03/22 16:22ID:???
>357
できましたありがとう
0360nobodyさん03/03/25 22:15ID:8MjhOhZv
perlでDBD::Pg使ってました。
結果を変数にぶち込みたいんだけど
$結果 = $db->selectrow_array("SQL文");
みたいに1行で片付けたい。
PHPだとどうすればいいんかな?

良くわからんのでとりあえず
$rs = pg_query($con, "SQL文");
$結果 = pg_fetch_result($rs,0,0);
にしてるんだけど何か変な気がするし。
昨日PHPはじめた漏れに誰か教えてクレイ。
0361nobodyさん03/03/26 01:04ID:???
>>360
PEARのDB使え。
ttp://pear.php.net/manual/en/core.db.php
0362nobodyさん03/03/26 18:48ID:+smbNkro
複数のファイルの値をひらいて
1回の起動で1ファイルに1回その値をINSERT INTOで
データベースに流し込んで
それを複数回繰り返しているPHPがあるんだけど
なんかメモリが急に100%になってすまう?
0363nobodyさん03/03/27 13:31ID:???
>>362
メモリが100%になるってなんだよ。今まで半分しか使ってなかった
メモリがやっと100%使えるようになったって意味か?よかったな。

で、その100%って何を見て確認したの?
036436203/03/28 11:54ID:PjWv+k5d
>で、その100%って何を見て確認したの?
phpsysinfoってPHPなんすけど。見やすいのでコレで確認すてます。
http://phpsysinfo.sourceforge.net/
ひどくなってくるとスワップまで食い尽くしてメモリオーバーになっちゃう。
しょうがないのでリブート(まだローカルのテストなんでいいけど・・)。
なんか違う方法を考えよう。
CSVのデータを大量にDBに追加する時って何でやってますか?。皆様は?
036536203/03/28 12:08ID:???
ああ。COPYですればいいかぁ。
でも、COPYだと一度ファイルに落とさなきゃならないかぁ。
ブツブツ独り言でし。sage
0366nobodyさん03/03/28 15:33ID:???
>>365
何が問題なんだかよくわからんが、とりあえずLinuxなら
http://www.math.kobe-u.ac.jp/~kodama/tips-free-memory.html
でも見れ。
036736203/03/28 16:41ID:???
>>366
おお、すばらすいページだ。こんなん探してますた。
サンクスでし。
なるほどぉ、LINUXのメモリ管理ってのはこうなってたのか。
勉強になりますた。
0368nobodyさん03/04/16 18:58ID:0S8YCSoo
PHP4+PostgreSQLで、新しくWEBを作る時、
最近ではPEARとPHPlibはどっちがお勧めでしょう?

気分的には新しいPHP4標準?のPEARがいいような
気がするんだけど、PHPlibの方がなんとなく使い勝手が
よいような気がするんですが・・・。

それと、どちらも詳しいリファレンスが乗ってる書籍とか
あったら教えてください。
0369nobodyさん03/04/16 21:12ID:RoExleB5
6.xインスコしてある鯖使ったんだけど、
「JOINはまだ実装されていません」と言われてがーん
最新版にアップデートしたら、
「datetimeって型はありません」
といわれ、コードをすべて書き直した。
あーめんどくさ
0370nobodyさん03/04/17 01:15ID:???
>>368
最近はPEARしか使ってないなぁ
ところでphplibってまだメンテされてるの?
037136803/04/17 09:56ID:???
>370
PHPlibはここに↓2003年1月13日のバージョンがあるようです。
https://sourceforge.net/projects/phplib/
メンテされてるかは不明・・・。

手元にある「PHP×PostgreSQLで作る最強Webシステム」
(2003年1月9日初版:石井達夫著)の本には、

 PEARは発展中のシステムで、ドキュメントもまだまだ整備が必要
 (logout(),listUser()・・・などの関数はその存在すら記載されてない)

と書いてあるんです。PHPlibのマニュアルよりは読みやすいですけど。

PHP5がでるかもしれないっていうときに、PHP3の物を使い始めるっていうのも
どうかと思うが、PHPlibの方が当面は使い勝手がよいなら、こっちの選択も
アリかな、、、と迷ってる次第です。。。

それぞれ使ってる方の意見なぞ、きけるとうれしいです。
0372山崎渉03/04/17 11:57ID:???
(^^)
0373nobodyさん03/04/17 23:31ID:38lUA/N9
php_pgsql.dll下さい。
何処に落ちてますか。
037437303/04/17 23:37ID:???
やっぱり今のは無かったことに。
0375佐々木健介03/04/18 00:19ID:???
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (5      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < こんなサイトを見つけた
|| | | |  \ ┃  ┃/    \  正直、スマンカッタ
| || | |    ̄         \_________
http://freeweb2.kakiko.com/mona/
0376動画直リン03/04/18 00:26ID:s9K3wIjP
http://www.agemasukudasai.com/movie/
0377nobodyさん03/04/19 16:04ID:???
あのさ、例えば従業員の名前やら住所やらが入ってる
データベースをブラウザから管理出来るようなシステム
をPostgresQL + PHPで作るとしますよね。

従業員の数が多い場合は複数のページに分割して表示
するような形になると思うけど、例えば従業員が82人
いて、1ページに10人ずつ表示するとすると、メイン
ページに[1ページ目][2ページ目]..[9ページ目]みたい
なリンクを表示させます。で、この[9ページ目]までと
いうのを計算するのに普通はどういう処理をするので
しょうか?

自分はわざわざ
$sql = "SELECT * FROM hoge;
$rec = pg_query($conn,$sql);
$line = pg_num_rows($rec);
としてるんですが、なんだか非効率な気がします。。


0378nobodyさん03/04/19 16:17ID:???
LIMIT と OFFSET を使う。
0379nobodyさん03/04/19 16:48ID:???
>>378
各ページを表示させるときはそうなんですけど、全件数が分からないと
各ページへのリンクを表示させるところでどう処理すればいいのかな
と思ったんです。
0380gn355my003/04/19 17:58ID:???
count()
0381名無しさん@Emacs03/04/19 19:09ID:???
>379
100件表示するページなら、LIMIT 101とする。

100件(以下)が返ってきたら次のページは無い。
101件返ってきたら次のページに続く。

当然、表示するのは100件までよ。
0382名無しさん@Emacs03/04/19 19:10ID:???
ちなみに、全件数を知りたいなら、INSERTやDELETEにトリガを仕込んで
カウンタを別に持つ方が無難。更新の少ないシステムならね。
0383nobodyさん03/04/19 22:19ID:3QKaD4h9
timestamp型をepoch秒で返す関数ってありませんか?
0384山崎渉03/04/20 05:58ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0385nobodyさん03/04/20 07:17ID:JR0rvjcu
このスレ今日はじめて見ましたが、実務経験豊富な方が
大勢住んでいらっしゃるようですね。

スレ違いかもしれませんが、PHP+PostgreSQLのシステム
なので質問させてください。

100画面程度の業務WEBアプリを作ろうとしています。
私がDBと画面仕様を書いて業者2人にPHPで
コーディングを担当してもらう予定です。

そこで質問ですが、WEBアプリの画面設計仕様書には、
どんな項目を書くべきでしょうか?
画面に表示する項目はもちろんですが、POSTやGETで渡される
パラメータ、デザイナに引き渡すテンプレート変数、画面間で
引き渡すセッション変数、それらをアンレジストするタイミング、
などなど、どのように仕様書にまとめたらいいのでしょう?

0386名無しさん@Emacs03/04/20 12:54ID:???
>377
それから、カウントするために

SELECT * FROM hoge;

すると、すべてのカラムが返されてくるので非効率的(ネットワーク的にも)。
数を数えるなら、どこかひとつのカラムだけにするか、

SELECT COUNT(*) FROM hoge;

として、バックエンドに数えさせるべき。
0387nobodyさん03/04/20 15:04ID:???
>>386
レスサンクスです。とりあえずその方法に変更しておきました。
>>382
の方法ってのは、カウンタ用のテーブルを作成しておいて
他のテーブルが更新された時にそのカウンタを更新するよう
にトリガを仕込むってことですよね?更新頻度が多いと>>386
のほうが効率よいですか?
0388nobodyさん03/04/20 15:34ID:???
>>387
自己レスですけどUPDATEは頻繁に行われるがINSERTと
DELETEはあまりないので、トリガ仕込んでみようと
思います。
0389nobodyさん03/04/20 23:37ID:xyBrUgxr
Win2000proでPostgreSQLのインストール設定を誰か教えてください。

いまのところ、Cygwinをインストールし、Postgresql・cygipcを解凍した
とこまでしかできません。そのあとの設定がうまくいかず困っています。

usr/local/src/postgresql-7.3の
./configureコマンド入力後、

checking build system type... i686-pc-cygwin
checking host system type... i686-pc-cygwin
checking which template to use... win
checking whether to build with 64-bit integer date/time support... no
checking whether to build with recode support... no
checking whether NLS is wanted... no
checking for default port number... 5432
checking for default soft limit on number of connections... 32
checking for gcc... no
checking for cc... no
configure: error: no acceptable C compiler found in $PATH
と表示されます。ここからがわかりません。
どうか教えてください。

0390_03/04/20 23:38ID:???
( ´∀`)/< 先生!!こんなのを見つけました。
http://web2001.kakiko.com/koma/hankaku/hankaku07.html
http://www.web2001.kakiko.com/koma/hankaku/hankaku08.html
http://web2001.kakiko.com/koma/hankaku/hankaku10.html
http://www.web2001.kakiko.com/koma/hankaku/hankaku09.html
http://web2001.kakiko.com/koma/hankaku/hankaku06.html
http://www.web2001.kakiko.com/koma/hankaku/hankaku05.html
http://web2001.kakiko.com/koma/hankaku/hankaku01.html
http://www.web2001.kakiko.com/koma/hankaku/hankaku02.html
http://web2001.kakiko.com/koma/hankaku/hankaku03.html
http://www.web2001.kakiko.com/koma/hankaku/hankaku04.html
0391nobodyさん03/04/20 23:48ID:???
configure: error: no acceptable C compiler found in $PATH
エラーの内容が分かんないようだと、Win nativeなヤツを使うほうがいいかと。
0392nobodyさん03/04/23 10:59ID:???
全件数をカウントする関数を作りたいんですけど、
今 employee1,employee2 というテーブルがあります。
次に counter というテーブルを作成して、そこに
employee1,employee2という列を定義し、ここに全件数
をカウントした数字を入力したいと思ってます。

CREATE FUNCTION count_table(text) RETURNS integer AS '
DECLARE
counters integer;
BEGIN
counters := SELECT COUNT(*) FROM $1;
UPDATE counter SET $1 = counters;
return counter;
END;
' LANGUAGE 'plpgsql';

というふうに関数を定義して、select count_table('employee1')
を実行すると
ERROR: parser: parse error at or near "SELECT" at character 9
と怒られます。どう修正したらよいでしょうか?
0393ななし03/04/23 19:12ID:???
>392
SELECT INTO
0394nobodyさん03/04/24 09:51ID:???
>>393
SELECT INTO counters COUNT(*) FROM $1;
でいけますた。ありがとう。
0395nobodyさん03/04/24 10:45ID:???
CREATE TABLE temp(
id text,
name text);

CREATE TABLE temp_counter(
temp integer);

CREATE FUNCTION temp_counter() RETURNS OPAQUE AS '
DECLARE
counters integer;
BEGIN
SELECT INTO counters COUNT(*) FROM TG_ARGV[0];
UPDATE temp_counter SET TG_ARGV[0] = counters;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER temp_trigger
AFTER INSERT OR DELETE
ON temp
FOR EACH ROW
EXECUTE PROCEDURE temp_counter('temp');

INSERT INTO temp VALUES ('hoge','moga');
とすると
WARNING: Error occurred while executing PL/pgSQL function temp_counter
WARNING: line 4 at select into variables
ERROR: parser: parse error at or near "$1" at character 24
というエラーが出てしまうんですが。。なんでですか?
質問ばっかですみません。
0396しろ03/04/24 17:40ID:???
テーブル名指定したいなら、引数じゃなくてTG_RELNAMEが使えると思うけど?
TG_RELNAMEはname型だけどね。

それと気になるのがtempというテーブル名。

何がやりたいのかよくわからないが、tempは一時テーブルの名前なんだけど
わかってますか?セッションが終わると自動的に削除されちゃうけどいいの?

マニュアル読んだほうがいいよ?ここ↓
http://www.postgresql.jp/document/pg721doc/index.html
functionはここ↓
http://www.postgresql.jp/document/pg721doc/programmer/plpgsql.html
結構判りやすいと思うんだけど・・・。
0397しろ03/04/24 17:41ID:???
396は395のレスです。スマソ
0398nobodyさん03/04/24 20:13ID:???
>>396
マニュアルは一通り目を通しました。あとtempというテーブル名
は例にあげただけで実際は違う名前です。まぎらわしくてすみま
せん。関数の部分を下記のように変更しました。

SELECT INTO counters COUNT(*) FROM TG_RELNAME;
UPDATE temp_counter SET TG_RELNAME = counters;

でもやはり insert するときに
WARNING: Error occurred while executing PL/pgSQL function temp_counter
WARNING: line 4 at select into variables
ERROR: parser: parse error at or near "$1" at character 24
というエラーが出てしまいます。そもそも"$1"なんて使ってない
んですが。。
0399しろ03/04/25 11:17ID:???
>398
> あとtempというテーブル名は例にあげただけで実際は違う名前です。
> まぎらわしくてすみません。

という事は、name,とかidとかいったフィールド名も使ってないわけですか?
ホントに紛らわしいです・・・。

> マニュアルは一通り目を通しました。
・・・
> そもそも"$1"なんて使ってないんですが。。

もう一度じっくり読んだほうがいいと思います。

$1については下記に書いてあります↓
http://www.postgresql.jp/document/pg721doc/programmer/plpgsql-declarations.html
要するにトリガで指定している引数の部分を指してると思います。

トリガファンクションについても、もう一度よく読んだほうが良いです。
RETURN とか EXECUTE とか。

もう一つ、これは別の方法ですが、SELECT INTO使わなくても、
カウント数はサブクエリを使えば一つのクエリで済むと思います。
 例:UPDATE テーブル名 SET 列名 = (SELECT COUNT(*) FROM テーブル名);

では頑張ってください。
0400nobodyさん03/04/25 22:48ID:???
>>399
レスどうもです。あと一歩というとこまでなんとかこぎつけました。
CREATE TRIGGER my_trigger
AFTER INSERT OR DELETE
ON my_table
FOR EACH ROW
EXECUTE PROCEDURE my_counter();

CREATE FUNCTION my_counter() RETURNS OPAQUE AS '
BEGIN
UPDATE my_counter_table SET my_table = (SELECT COUNT(*) FROM my_table);
RETURN NULL;
END;
' LANGUAGE 'plpgsql';

とすることで成功しました。
で、本当にやりたいことなんですが
0401nobodyさん03/04/25 22:56ID:???
my_counter_tableというテーブルで複数のテーブルの全件数を
管理したいのです。たとえば'hoge','moga','2ch'というテーブル
の全件数を管理したい場合、my_counter_tableに'hoge','moga','2ch'
という列を定義して、そこに全件数を記録する感じです。
そのあと各テーブルにトリガを作成して同じ関数を呼び出します。
そのときに関数を
UPDATE my_counter_table SET TG_RELNAME = (SELECT COUNT(*) FROM TG_RELNAME);
のようにすれば1つの関数を定義するだけで済むかなと思った
んです。でも上記のようにするとINSERTを実行する時に
ERROR: parser: parse error at or near "$1" at character 26
というエラーが出てしまうのです。トリガを
EXECUTE PROCEDURE my_counter('hoge');
のように定義して、関数を
UPDATE my_counter_table SET TG_ARGV[0] = (SELECT COUNT(*) FROM TG_ARGV[0]);
としても同じエラーが出ます。こういうふうには使えないの?
0402nobodyさん03/04/26 00:58ID:???
動的問い合わせには EXECUTE を使え。
いま環境ないからてきとうだけど、

EXECUTE ''UPDATE my_counter_table SET ''
|| quote_ident(TG_RELNAME)
|| ''=(SELECT COUNT(*) FROM ''
|| quote_ident(TG_RELNAME)

でどうよ。

ttp://www.postgresql.jp/document/pg721doc/programmer/plpgsql-statements.html
23.5.4. 動的問い合わせの実行

も見れ。
0403nobodyさん03/04/26 12:05ID:???
>>402
CREATE FUNCTION temp_counter() RETURNS OPAQUE AS '
BEGIN
EXECUTE ''UPDATE my_counter_table SET ''
|| quote_ident(TG_RELNAME)
|| ''=(SELECT COUNT(*) FROM ''
|| quote_ident(TG_RELNAME)''
|| '';
RETURN NULL;
END;
' LANGUAGE 'plpgsql';
こうしてみたんですが
parser: parse error at or near "'
|| '" at character 110
というエラーが出ます。
シングルクォーテーションは '' で表す。
テーブル名や列名は quote_ident 関数に通さないといけない。
ということなので上記の文は
UPDATE my_counter_table SET 'hoge' = (SELECT COUNT(*) FROM 'hoge'
という文字列を実行するってことですよね?
||の意味がよく分からないので、そこに問題がある
気がします。ドキュメントを読んでもダメでした。
||はどういう意味なんですか?
0404nobodyさん03/04/26 18:37ID:???
>>395
「業者2人」がたいへんそうですね
040540203/04/27 21:51ID:???
>>403
最後のほうが微妙にちがうかも?

CREATE FUNCTION temp_counter() RETURNS OPAQUE AS '
BEGIN
EXECUTE ''UPDATE my_counter_table SET ''
|| quote_ident(TG_RELNAME)
|| ''=(SELECT COUNT(*) FROM ''
|| quote_ident(TG_RELNAME)
|| '')'';
RETURN NULL;
END;
' LANGUAGE 'plpgsql';

|| は文字列の結合です。
0406nobodyさん03/04/27 23:08ID:???
>>405
上手くいきますた!
長年の夢が叶った感じです。どうもありがとう。
0407nobodyさん03/04/29 11:51ID:???
ttp://itb-tech.itboost.co.jp/php/php_12.php
PostgreSQLでセッション変数管理したいな
と思ってたんですけど、ここ見たらmysql
の方がいいかなと思ってしまいました。
みなさんはどうしてます?
0408nobodyさん03/04/29 13:04ID:???
>>407
対象pgsqlのバージョンが古そうだな。今は稼動しながらvacuumできる。
ま、セッション管理のためだけなら、軽いと言われるMysqlの方がいいかもね。
■ このスレッドは過去ログ倉庫に格納されています