end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

postgresでのtableやcolumnへのコメント追加は「COMMENT ON ~ IS '$comment'」

以下のentryの関連です。

mysqlの"show create table" のpostgresにおける代替は、"pg_dump --schema-only" - end0tknr's kipple - web写経開発

mysqlと異なり、postgresでのtableやcolumnへのコメント追加は 「COMMENT ON ~ IS '$comment'」で行うみたい。

テーブル コメント 追加

「%s」の部分には、テーブル名、コメントを指定します

postgrs> COMMENT ON TABLE %s IS '%s'

カラム コメント 追加

「%s」の部分には、テーブル名、カラム名、コメントを指定します

sql> COMMENT ON COLUMN %s.%s IS '%s'

テーブル コメント 参照 - \d+ コマンド

postgres=> \d+                                                                                                                                                           \d+
 Schema |              Name       |   Type   |   Size    |           Description            
--------+-------------------------+----------+-----------+----------------------------------
 public | gis_chika               | table    |112 MB     | 都道府県地価調査データ
 public | gis_chika_koji          | table    |67 MB      | 地価公示データ
 public | gis_gyosei_kuiki        | table    |314 MB     | 行政区域データ
 public | gis_jinko_shuchu        | table    |31 MB      | 人口集中地区データ
 public | gis_jinko_suikei_1km    | table    |697 MB     | 1kmメッシュ別将来推計人口データ
 public | gis_jinko_suikei_500m   | table    |1840 MB    | 500mメッシュ別将来推計人口データ
 public | gis_tochi_riyo_shousai  | table    |1375 MB    | 土地利用詳細メッシュデータ
 public | gis_youto_chiiki        | table    |369 MB     | 用途地域データ

カラム コメント 参照 - \d+ コマンド

postgres=> \d+ gis_chika
 Column  |          Type          |     Description      
---------+------------------------+----------------------
 gid     | integer                | 
 l02_001 | character varying(3)   | 
 l02_002 | character varying(3)   | 一連番号
 l02_003 | character varying(3)   | 
 l02_004 | character varying(3)   | 一連番号
 l02_005 | character varying(4)   | 年度
 l02_006 | integer                | 調査価格
 l02_007 | double precision       | 対前年変動率
 l02_008 | smallint               | 
 l02_009 | character varying(5)   | 住居漢字
 l02_010 | character varying(5)   | 地積
 l02_011 | character varying(5)   | 利用の現況
 l02_012 | character varying(5)   | 建物構造
    :        :                       :

カラム コメント 参照 - select文

springvue=> select
springvue->   isc.column_name, isc.data_type, pd.description
springvue-> from information_schema.columns as isc
springvue-> left join pg_description as pd
springvue->   on ( pd.objsubid=isc.ordinal_position )
springvue-> left join pg_stat_user_tables as psut
springvue->   on (pd.objoid=psut.relid and psut.relname=isc.table_name)
springvue-> where isc.table_catalog='springvue' and isc.table_name='gis_chika'
springvue-> ORDER BY isc.ORDINAL_POSITION;
 column_name |     data_type     |            description             
-------------+-------------------+------------------------------------
 gid         | integer           | 
 l02_001     | character varying | DIDid
 l02_001     | character varying | 基準地域メッシュコード
 l02_001     | character varying | 分割地域メッシュコード
 l02_001     | character varying | 行政区域コード
 l02_001     | character varying | メッシュコード
 l02_001     | character varying | 都道府県名
 l02_002     | character varying | 一連番号
 l02_002     | character varying | 支庁・振興局名
 l02_002     | character varying | 行政区域コード
 l02_002     | character varying | 行政区域コード
 l02_002     | character varying | 行政区域コード
 l02_002     | character varying | 都道府県名

psycopg2 for python3 で、コメントの登録&参照

#!python
# -*- coding: utf-8 -*-

import appbase

logger = appbase.AppBase.get_logger()

class Db(appbase.AppBase):
    
    def __init__(self):
        pass

    def col_defs(self,tbl_name):
        conf = self.get_conf()
        db_conn = self.db_connect()
        cur = self.db_cursor(db_conn)
        sql = """
select
  isc.column_name, isc.data_type, pd.description
from information_schema.columns as isc
left join pg_description as pd
  on ( pd.objsubid=isc.ordinal_position )
left join pg_stat_user_tables as psut
  on (pd.objoid=psut.relid and psut.relname=isc.table_name)
where isc.table_catalog=%s and isc.table_name=%s
ORDER BY isc.ORDINAL_POSITION
"""
        try:
            cur.execute(sql, [conf["db"]["db_name"],tbl_name])
        except Exception as e:
            logger.error(e)
            return []
        
        ret_rows = []
        for row in cur.fetchall():
            ret_rows.append( dict(row) )
            
        return ret_rows

    def save_col_comment(self,tbl_name,col_name,comment):
        logger.info( " ".join([tbl_name,col_name,comment]) )

        conf = self.get_conf()
        db_conn = self.db_connect()
        cur = self.db_cursor(db_conn)
        sql = "COMMENT ON COLUMN %s.%s IS '%s'"%(tbl_name,col_name,comment)
        try:
            cur.execute(sql)
            db_conn.commit()
        except Exception as e:
            logger.error(" ".join([sql]))
            logger.error(e)
            return False
            
        return True
    
    def save_tbl_comment(self,tbl_name,comment):
        logger.info( " ".join([tbl_name,comment]) )

        conf = self.get_conf()
        db_conn = self.db_connect()
        cur = self.db_cursor(db_conn)
        sql = "COMMENT ON TABLE %s IS '%s'"%(tbl_name,comment)
        try:

            cur.execute(sql)
            db_conn.commit()
        except Exception as e:
            logger.error(" ".join([sql]))
            logger.error(e)
            return False
            
        return True