DBモジュールとカラム情報

 DBモジュールのカーソルから、カラムのデータ型などの情報を取得する方法は、 APIで標準化されています。 次のソースプログラムはその機能を使って作ってみたモジュール (ColumnInfoLister.py)です。

""" ********************************************************
カーソルで実行したSQL文のカラム情報を標準出力に出力します。
パラメータ:
 cur ... SELECT文をexecute()で実行した直後の状態のカーソル
戻り値:
 なし。
""" ********************************************************
def listdesc(cur):
  seq = cur.description

  for col in seq:
    (name, type_code, display_size, internal_size,
     precision, scale, null_ok) = col
    print "%-10s %-10s %2d %2d %2d %2d %d" % \
    (name, type_code, display_size, internal_size,\
     precision, scale, null_ok)
    """ kinterbasdbの例:
    COL1 <type 'string'> 30 30 0 0 1
    COL2 <type 'long int'> 17 8 12 -2 1
    """
# end.

.description属性は、各々が7つの要素からなる配列が、 さらにカラムの数だけ並んだ配列です。 7の要素は例の通り、カラム名、データ型、表示用のサイズ、 内部用のサイズ、有効桁数、小数点以下の桁数、NULL可否 (1…可、0…否)で、カラム名とデータ型が必須、残りは DBモジュールに依存するオプションです。 内部用のサイズは特に役立つケースはないでしょう。 表示用のサイズはテキスト整形したりするときに使うのかな。 (私は特に利点が分かりませんが) 有効桁数、小数点以下の桁数の表記方法は、DBモジュールによって異なります。 ここで試したkinterbasdb(Interbase/FirebirdのDBモジュール) では、文字列型のカラムでは両方とも0、 数値型(INTEGER、SMALLINT、DECIMAL、NUMERIC、FLOAT、DOUBLE PRECISION) では、有効桁数はそのままデータ定義時の桁数、 小数点以下の桁数は負の整数で返されます。

 以下は、そのモジュールを使ってカラム情報を表示するスクリプトの例です。

from ColumnInfoLister import listdesc
import kinterbasdb

con = kinterbasdb.connect(dsn="localhost:c:/usr/dbms/fb/udb.gdb",
  user="urano", password="urano399", charset="SJIS")

# カーソルの作成。SELECT文のWHERE句はダミーで可
cur = con.cursor()
sql = "SELECT * FROM DWH_ORDERS WHERE ORDER_NUM = 'dummy'"
cur.execute(sql)

listdesc(cur)
cur.close()
con.close()
# end.

セクションのサブメニューに戻る
(first uploaded 2003/02/16 last updated (not ever))