象と戯れ

 | 

2008-12-13

char(n)のnをアプリケーションから取得する

10:19 | char(n)のnをアプリケーションから取得する - 象と戯れ を含むブックマーク はてなブックマーク - char(n)のnをアプリケーションから取得する - 象と戯れ

不慣れな入力系を作っているのですが、char(n)なカラムの最大長チェックを行う場合、どうやるのが一般的なんでしょうか。

とりあえずシステムカタログをあたると、

SELECT * FROM pg_attribute WHERE attrelid = 'tbl'::regclass::oid

atttypmodというのが見つかります。これは、型修飾と呼ばれる値で、char(n)のnに関連しているらしいことがわかります。

ですが、char(4)なカラムのatttypmodを参照すると、8が入っているので、そのままでは使えなそうです。

no title

format_type returns the SQL name of a data type that is identified by its type OID and possibly a type modifier. Pass NULL for the type modifier if no specific modifier is known.

というわけで、pgAdmin等でテーブル情報の欄に表示されるCREATE TABLE文などはこの関数を使っているようです。


コードは以下の通り。

PostgreSQL Source Code: src/backend/utils/adt/format_type.c File Reference

ドキュメントにもあるように、pg_typeにある型修飾関数を呼び出す(組み込み型の場合はデフォルトの挙動)みたいですね。

select format_type(atttypid, atttypmod), * from pg_attribute inner join pg_type on pg_attribute.atttypid = pg_type.oid where attrelid = 'tbl'::regclass::oid 

みたいな感じで、tblテーブルの各カラムのSQL表現を取得すれば、あとは正規表現か何かで最大長がとれそうです。

本当はもっと簡単に取得できそうな気がするのですが・・・。というか、こういうケースって特殊ではないと思うのですが、みんなどうやっているんでしょう。

iakioiakio2008/12/13 19:31男らしくatttypemod-4するとかw

umitanukiumitanuki2008/12/14 00:15漢らしすぎるw

 |