Notice
Recent Posts
Recent Comments
Link
꾸준한 개발일기
리눅스:: psql로 DDL문 추출하기, 데이터 건수 확인하기 본문
반응형
:: psql로 DDL문 추출하기
데이터베이스 테이블에서 geom 컬럼의 데이터 타입이 geometry여야 하는데 character varying으로 설정되어있었다. 원인을 분석하기 위해 DDL을 추출해보았다.
1. ssh에서 psql로 접속한다.
꼭 필요한 psql로 리눅스에서 데이터베이스 연결, 확인하기
웹사이트로 운영서버에 데이터를 적재하고, 이를 확인하기 위해 리눅스를 사용한다. 로컬이나 개발서버에서 처럼 DBeaver(DB 프로그램)를 사용하면 편하겠지만 ssh와 sftp만을 사용하여 관리해야하
dev-h2.tistory.com
2. generate_create_table_statement 함수를 생성한다.
복잡해 보이지만 밑에 코드를 모두 복붙하고 엔터치면 된다.
CREATE OR REPLACE FUNCTION generate_create_table_statement(p_table_name varchar)
RETURNS text AS
$BODY$
DECLARE
v_table_ddl text;
column_record record;
BEGIN
FOR column_record IN
SELECT
b.nspname as schema_name,
b.relname as table_name,
a.attname as column_name,
pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type,
CASE WHEN
(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN
'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
ELSE
''
END as column_default_value,
CASE WHEN a.attnotnull = true THEN
'NOT NULL'
ELSE
'NULL'
END as column_not_null,
a.attnum as attnum,
e.max_attnum as max_attnum
FROM
pg_catalog.pg_attribute a
INNER JOIN
(SELECT c.oid,
n.nspname,
c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ ('^('||p_table_name||')$')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 2, 3) b
ON a.attrelid = b.oid
INNER JOIN
(SELECT
a.attrelid,
max(a.attnum) as max_attnum
FROM pg_catalog.pg_attribute a
WHERE a.attnum > 0
AND NOT a.attisdropped
GROUP BY a.attrelid) e
ON a.attrelid=e.attrelid
WHERE a.attnum > 0
AND NOT a.attisdropped
ORDER BY a.attnum
LOOP
IF column_record.attnum = 1 THEN
v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' (';
ELSE
v_table_ddl:=v_table_ddl||',';
END IF;
IF column_record.attnum <= column_record.max_attnum THEN
v_table_ddl:=v_table_ddl||chr(10)||
' '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null;
END IF;
END LOOP;
v_table_ddl:=v_table_ddl||');';
RETURN v_table_ddl;
END;
$BODY$
LANGUAGE 'plpgsql' COST 100.0 SECURITY INVOKER;
3. 함수를 이용하여 DDL문을 추출한다
SELECT generate_create_table_statement('테이블명');
결과:
postgres=# SELECT generate_create_table_statement('테이블명');
generate_create_table_statement
------------------------------------------------------------------------------------
CREATE TABLE 스키마.테이블명 ( +
column1 integer DEFAULT NOT NULL,+
column2 character varying NULL, +
column3 character varying NOT NULL, +
column4 character varying NULL, +
column5 character varying NULL, +
column6 bigint NULL, +
column7 character varying NULL);
(1 row)
create문이 추출되었다.
4. 함수를 삭제해준다.
수정없이 밑 코드를 그대로 복사 붙여넣기 해준다.
DROP FUNCTION generate_create_table_statement(p_table_name varchar);
:: 데이터 건수 확인하기
select count(*) from 테이블명;
리눅스에서도 count(*)함수를 이용하여 확인할 수 있다.
결과:
count
---------
2332814
(1 row)
총 2332814개의 데이터가 있는 것을 확인하였다.
출처:
반응형
'Programing > 리눅스' 카테고리의 다른 글
리눅스 :: too many clients already 오류 해결(postgresql.conf 위치, max_connections 수정 방법) (0) | 2021.12.03 |
---|---|
리눅스:: Centos 서버 시간 확인, 설정 (0) | 2021.12.02 |
리눅스:: 꼭 필요한 psql로 데이터베이스 연결, 확인하기 (0) | 2021.11.10 |
리눅스 포트 열렸는지 확인하는 방법(telnet) (0) | 2021.11.04 |
-bash: ~.sh: command not found 에러 해결 (0) | 2021.11.02 |