1. 개요
- 이번 포스트에서는 PostgreSQL에서 DDL 정보를 추출하기 위한 SQL을 포스팅하겠습니다.
- 개발 시 테이블 정의 등을 작성해야 하는데 일일이 작성하기 번거롭다.
- DDL SQL을 이용하여 테이블명/컬럼명/타입 정보를 출력해 보자.
2. 설치 및 문서화 정보
- Windows의 경우 Postgresl 사이트에 접속하여 쉽게 설치할 수 있습니다.
- Linux의 경우 아래 링크를 참조하십시오.
- https://arckwon.entry/AWS-EC2-Ubuntu%EC%97%90-postgresql-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0
(AWS EC2) Ubuntu에 postgresql 설치
1. 개요 설치부터 pgAdmin 연결까지 우분투 버전에 따라 설치할 수 있는 postgresql 버전이 다릅니다. 2. 설치 환경 OS: AWS EC2 ubuntu20.04 DB: PostgreSQL14 https://www.postgresql.org/download/linux/ubuntu/ 참고자료 보기
arckwon.tistory.com
- 문서 문서는 현재 최대 15개 버전으로 존재합니다.
3. 테이블 정보 SQL
- 스키마에 등록된 테이블 정보를 조회하기 위한 SQL.
- 실행 중에 테이블이 쿼리됩니다.
SELECT tablename
FROM PG_TABLES
WHERE TABLENAME LIKE 'users%'
ORDER BY TABLENAME ASC
4. 스키마 / 테이블명 / 테이블 COMMENT SQL
- PG_CATALOG 시스템 테이블 카테고리의 PG_CLASS 테이블과 PG_NAMESPACE 테이블에 대한 정보를 확인한다.
SELECT N.NSPNAME, C.RELNAME, OBJ_DESCRIPTION(C.OID)
FROM PG_CATALOG.PG_CLASS C INNER JOIN PG_CATALOG.PG_NAMESPACE N ON C.RELNAMESPACE=N.OID
WHERE C.RELKIND = 'r'
AND N.NSPNAME = 'public'
ORDER BY C.RELNAME ASC
5. 테이블명 / 컬럼명 / 컬럼 주석 SQL
- 시스템 테이블의 PG_STAT_ALL_TABLES , PG_DESCRIPTION 및 PG_ATTRIBUTE에 대한 정보를 확인하십시오.
SELECT PS.RELNAME AS TABLE_NAME,
PA.ATTNAME AS COLUMN_NAME,
PD.DESCRIPTION AS COLUMN_COMMENT
FROM PG_STAT_ALL_TABLES PS, PG_DESCRIPTION PD, PG_ATTRIBUTE PA
WHERE PD.OBJSUBID<>0
AND PS.RELID=PD.OBJOID
AND PD.OBJOID=PA.ATTRELID
AND PD.OBJSUBID=PA.ATTNUM
ORDER BY PS.RELNAME, PD.OBJSUBID
6. 테이블 설명 SQL
- 마지막 where 절에 테이블 이름 입력
- 일반적으로 개발 출력을 작성할 때 적절한 SQL을 사용하여 Excel에서 쉽게 작성할 수 있습니다.
SELECT
COLS.TABLE_NAME,
COLS.COLUMN_NAME,
C.COMMENT,
UPPER(COLS.UDT_NAME) AS "TYPE",
(CASE
WHEN COLS.CHARACTER_MAXIMUM_LENGTH IS NULL THEN ''
ELSE CAST(COLS.CHARACTER_MAXIMUM_LENGTH AS VARCHAR)
END) AS LENGTH,
(CASE
WHEN COLS.IS_NULLABLE = 'NO' THEN 'Y'
ELSE 'N'
END) AS "NULLABLE",
(CASE
WHEN COLS.IS_IDENTITY = 'NO' THEN ''
ELSE 'PK'
END) AS IS_IDENTITY ,
COLS.COLUMN_DEFAULT AS DEFAULT,
(SELECT OBJ_DESCRIPTION(C.OID) FROM PG_CATALOG.PG_CLASS C
WHERE C.RELNAME = COLS.TABLE_NAME) AS TABLE_DESC
FROM
INFORMATION_SCHEMA.COLUMNS COLS
INNER JOIN (
SELECT
C.RELNAME AS TABLE_NAME,
A.ATTNAME AS "COLUMN_NAME",
(
SELECT
COL_DESCRIPTION(A.ATTRELID, A.ATTNUM)) AS COMMENT
FROM
PG_CATALOG.PG_CLASS C
INNER JOIN PG_CATALOG.PG_ATTRIBUTE A ON
A.ATTRELID = C.OID
WHERE
C.RELNAME IN (
SELECT
T.TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES T
INNER JOIN PG_CATALOG.PG_CLASS PGC ON
T.TABLE_NAME = PGC.RELNAME
WHERE
T.TABLE_TYPE = 'BASE TABLE'
AND T.TABLE_SCHEMA = 'PUBLIC'
ORDER BY
TABLE_NAME)
AND A.ATTNUM > 0
AND A.ATTISDROPPED IS FALSE
AND PG_CATALOG.PG_TABLE_IS_VISIBLE(C.OID)
ORDER BY
RELNAME,
A.ATTRELID,
A.ATTNUM) C ON
(COLS.TABLE_NAME = C.TABLE_NAME
AND COLS.COLUMN_NAME = C.COLUMN_NAME)
WHERE
COLS.TABLE_NAME = '테이블명';
- 위의 SQL을 실행하면 다음과 같은 결과가 반환됩니다.