カテゴリー別アーカイブ: postgresql

adodb::[-1: Missing extension for postgres] in CONNECT(localhost, ‘*****’, ‘****’, ‘*****’);

接続情報は確かにあっているはずなのに以下のエラーが出てポスグレに接続できない…。

[-1: Missing extension for postgres] in CONNECT(localhost, '*****', '****', '*****');

phpのExtensionが足りないから。

だそうですけど、具体的にどれ?というわけでもないので、、、

yumで見つけた

「php-pgsql.x86_64 5.3.3-46.el6_6」

をインストールしてWebサーバを再起動して読み込ませたら正常にpostgreSqlサーバに接続できました。

SQL文@データ挿入時の条件付きのIDカウント方法

データ挿入時のID採番が複合キーなどの別条件がある場合なんかもそうだが、
シーケンスなどの別機能を使うより安定性が増しシステムの柔軟性は上がると思う。

#このようなトランザクションで更新してもいいが、、、
INSERT INTO test(a) VALUES (-1);
UPDATE test SET a=(SELECT (SELECT MAX(a) FROM test)+1) WHERE a=-1;

#このような感じで1つにまとめることもできる。
insert into test (a,b) select max(a)+1 from test,'b';

以外にこの情報は少ない。

WebAplicationを柔軟に作成する応用例として必須の考え方だと思うが...

参考にしたURL
7ujm.net/SQL/countUp.html

postgreSQLによるユーザ作成と接続の基本(メモ)

# user01が所有者のdb01を作成
create user user01;
create database db01 owner user01;
#ログアウトして格闘記録にある設定をしたら以下で接続可。
psql -d db01 -U user01

--以下、格闘記録。
psql -d db01 -U user01
でログイン試験したところ…
psql: FATAL: Ident authentication failed for user "user01";
と出る。

www.postgresql.jp/document/8.2/html/auth-pg-hba-conf.html

このレコードで対応するデータベース名を指定します。 all という値は、全てのデータベースと対応することを指定します。 sameuserという値は、要求されたデータベースが要求ユーザと同じ名前を持つ場合にレコードが対応することを指定します。 samerole という値は、要求ユーザが要求されたデータベースと同じ名前のロールのメンバでなければならないことを指定します。 (以前はsamegroupと書いていましたが、sameroleと記述してください) それ以外の場合には、特定のPostgreSQLデータベースの名前になります。 データベースの名前はカンマで区切ることで複数指定できます。 データベース名を含む別のファイルを、そのファイル名の前に@を付けることで指定できます。

なのだそうですので、
PostgreSQLのエラー「psql: FATAL: Ident authentication failed for user "postgres"」の解消方法~コンソールでpsql -U postgresが失敗する場合~

cd /var/lib/pgsql/data/
vi pg_hba.conf
sameroleとなっているところを変更する…がない。
代わりに、identになっているので、trustに変更して再起動してみる。
DBサーバ化して別ホストからアクセスする予定もなきにしもあらずなので、
IPv4のところもついでにIPv6のところもtrustに変更しておく。
# TYPE DATABASE USER CIDR-ADDRESS METHOD

# "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident

psql -d db01 -U user01
…で問題なくログインできるようになった。

VPSにpostgresSQLをインストール(yum編)

【CentOS6.2にyumでpostgrSQL8.4をインストール】

# サーバをインスコ
yum install postgresql-server
# contribは便利モジュールらしいのでとりあえずインスコ
yum install postgresql-contrib
# db初期化
service postgresql initdb
# 起動
/etc/init.d/postgresql restart
# postgresユーザに。-は変数を引き継ぐとpostgresの場所PG_PATH変数などに影響をうけるため。
su - postgres
# ログイン
psql
で操作が可能。

以上。

-----以下は格闘記録。

yumはrpmの依存関係を管理するシステムだそうだ。
ソースコードからとってきた方が確実な気もする。
rpmとかいう拡張子が出てくるともうよくわからない。
アレルギーが出てくる感じがする。話が逸れた。

yumでインストールするとタイトルに書いてあるのに、
fedoraのrpmでインストールしませうっていうのは、
タイトル詐欺じゃないかと思います。話が逸れた。

#yumのupdateが済んでいなければ以下を実行
yum update

# postgresの有無を確認。
yum list | grep postgres

※余談。listで表示されたの8.4でした。借りているVPSのCentOs6.2が古いってことでしょうか。現在の最新版は9.2です。ダウンロードサイトから素直に落としてきたほうがよさげで間違いなさそうです。
www.enterprisedb.com/products-services-training/pgdownload

拡張子runとかいうrunファイルが落とせるが…何これ?
ubuntuforums.org/showthread.php?t=239797
oshiete.goo.ne.jp/qa/8366223.html
●runファイルって何よ?
→実行権限つければインストールできるらしい。

yum install wget
してから、、、、と思ったけどやめて、とりあえず8.4でいいや。
www.postgresql.org/download/linux/redhat/
この辺見てたら自分のOSにあったのいれたほうがいい気がしてきた。
yum install postgresql-server
yum install postgresql-contrib
を実行。

postgres initdb
"root" execution of the PostgreSQL server is not permitted.
The server must be started under an unprivileged user ID to prevent
possible system security compromise. See the documentation for
more information on how to properly start the server.

???

service postgresql initdb

--

PostgreSqlのunique属性の削除がうまくいかない件

psqlが8系でpostgres9系をいじくっているからだろうか?

以下のようにテーブルのuniqueなるキーを指定しても消えないことがある。


-- (1)

alter table tableA drop constraint tableA_unique_key;

試していないのだが、以下の方法で消えるらしい。


-- (2)

drop index tableA_unique_key;

ただし、alter table tableA add constraint unique(columnA);で追加したunique属性は(1)の構文で問題なく消える。postgresqlのバグなのかpsqlのSQL解釈がおかしい子なのかバージョン違いのせいなのか謎であるがどうにかして欲しい。それともdrop index hogehoge_indexという記述だけ覚えておけよいということなのだろうか。なんだか気持ち悪い問題である。

ERROR: invalid input syntax for type numeric: ” “

ERROR: invalid input syntax for type numeric: " "

CSVのデータをto_number関数にて数値型に変換しようした時などに出るエラーである。

NULLではない0文字の空白があるために起こる。" "の間に半角スペースがあるが、
実データには半角スペースすらない。

実データにNullや数値変換できない文字が入っていないことが明らかであれば、
以下のように変換前の文字列へ'0'を連結してやればよい。
(文字列の時やNULLの時はデータの見直し(テーブルの見直し?)や、
 正規表現等や条件式を駆使しないとダメだと思う。できるならば、
 まっとうなデータを入れる仕様に変えて欲しい(願望)。まあ、
 それが無理だからこんな関数などを噛まさないとダメなのですが。)

【変更前】
 to_number(data, '00000000')

 ↓

【変更後】
 to_number('0' || data, '00000000')

ERROR: multiple assignments to same column “id”

ERROR: multiple assignments to same column "id"

PostgreSQLによるエラーが出た。

update文で値をsetする対象のカラムが複数(2以上)ある時にエラーになるらしい。

当たり前と言えば当たり前か。

例ではidだが、(idは名前的に被らないことは明らかであり致命的なエラーであるが、)
どんなタイプや属性のカラムでもエラーになる。

hostgatorの解約

hostg

何か知らんけどhostgatorのbabyプランを解約したつもりがずっと支払状態になっていた。ドメインだけ解除したことになっていたのだろうか?思い出せない。英語でやりとりしているとなにしたか忘れる。ずっと請求が溜まって9.95$*8か月で79.60$にまで膨れ上がっていた。チリツモ。塵も積もれば山となる。怖い怖い。と言っても、そんなに大きい損失ではないが…知らないところでたまにクレジットが落ちているらしいし…いったい何何。英語ができないのに海外のレンタルサーバを利用しようとした報いかもしれない。勉強になりましたということで…。とりあえずpaymentとは別のフォームから解約申請を出しておいた。今度はうまくいくといいけど。statusがsuspendで課金され続けるっていうのはレンタルサーバ屋の慣例なんだろうか。さくらインターネットもASAHIネットも繋がらない状態にしているくせにその月の課金はしっかりしてきた過去があるが…驚きである。せめて使える状態にしておいて請求するべきなんじゃないか。支払いもせず放置していた私にも非があるとはいえ。。

select-update文を記述する時の注意点

// NG

update test a set a.c2 = (select b.c3 from test b where a.c2=b.c2) where a.c2 is null;

// OK

update test a set c2 = (select b.c3 from test b where a.c2=b.c2) where a.c2 is null;

setするカラムにa.という修飾子をつけるとエラーになる(postgres)。なぜか。更新対象のテーブルがtest as aであることは揺るがないからつける必要はないと言えば無いのだが、つけるのが癖になっている私としてはつけられないことに違和感を覚えます。