라벨이 postresql인 게시물 표시

django DB에 이모지 저장하기

요즘 이모지가 잘 나와서 icon을 제작해서 쓰는 것보다 친숙하고  시인성도 좋고 글 맥락에 적절하다. django github https://github.com/django/django/blob/main/tests/model_fields/test_textfield.py 를 참고한다. django/tests/model_fields/test_textfield.py class TextFieldTests(TestCase): def test_emoji(self): a = modelA(text = '😊') a.save() 이런 식으로 저장하면 됨

postgresql - Table에 Primary key, Foreign key, Composite key 설정하기

이미지
Primary key  CREATE TABLE IF NOT EXISTS product_type_code(     product_type_id char(8) PRIMARY KEY not null,     product_type_name char(100),     created_at timestamp default current_timestamp.     created_by varchar not null default current_user,     updated_at timestamp default current_timestamp,     updated_by varchar default current user, ) 예시 create table 스크립트에서는 trigger 예제를 제외하였다. updated_at 필드가 current_timestamp로만 찍히는 걸로 보일 수 있으나 row 데이터 update시 updated_at필드가 update 시각으로 변경되는 trigger와 procedure(function)를 추가하면 된다. Foreign key CREATE TABLE IF NOT EXISTS product(     product_id char(8) PRIMARY KEY not null,     product_type_code char(8) not null,     product_name char(100),     ...           constraint fk_product_type_code FOREIGN KEY(product_type_code) references                    product_type_code(pro...

postgresql - psql에서 테이블 정보 및 trigger 정보 열람하기, trigger 삭제

DB설계 툴로 DBeaver와 psql이라는 SqlShell을 사용하고 있다. 테이블이 잘 만들어졌는지, 테이블에 올바른 Trigger와 함수가 걸려있는지  확인하기위해 Dbeaver의 SQL편집기에서 pg_catalog 테이블을 참조하지만 간혹 psql의 간단한 명령어로도 원하는 정보를 볼 수 있어서  psql도 같이 켜놓고 이용하고 있다. psql command shell을 활용하는 방법 자주 쓰는 커맨드 정리 \dft 함수목록을 보여준다. \dS 테이블이름 테이블의 column 정보, 인덱싱이 어떻게 되었는지, 걸린 Trigger 등을 보여준다. postgres 에서는 trigger를 삭제할 때 반드시 trigger가 걸려있는 테이블을 지정하도록 한다. 하지만 이는 표준 SQL문법이 아니다. 표준 SQL에서는 테이블 이름을 지정하지 않고  DROP TRIGGER를 통해 Trigger를 삭제한다고 한다.  postgresql sql query로 열람하는 방법 전체 테이블 당 전체 trigger 열람 SELECT  event_object_table AS table_name ,trigger_name          FROM information_schema.triggers   GROUP BY table_name , trigger_name  ORDER BY table_name ,trigger_name  특정 테이블의 전체 trigger 열람 SELECT  event_object_table AS table_name ,trigger_name          FROM information_schema.triggers WHERE event_object_table ='테이블 명'  GROUP BY table_name , trigger_name  ORDER BY table_name...

postgresql - pg_catalog를 통한 테이블 목록 열람

SELECT * FROM pg_catalog.pg_tables where schemaname = 'public'; postresql은 내부적으로 pg_catalog를 통해서 관리용 정보, meta정보들을 테이블 형태로 관리한다. 사용자가 서비스를 구현하기 위해 직접 관리하는 테이블은 아니라는 의미에서 내부적이라는 용어를 사용하였음. schemaname에는 'public'이외에도 'pg_catalog','information_schema'가 존재

postgresql - $$, function, trigger를 이용하여 데이터 갱신 정보 갱신하기

Function, Trigger 관리는 번거롭다, 하지만... DB를 관리하는 입장에서는 사용자가 생성한 Function과 Trigger가 많다면 이것또한 비즈니스 로직 및 시스템 구조 변경시 관리할 대상이 된다. git으로 모듈, 코드의 버전 관리를 하는만큼  DBA는 Function, Trigger를 관리하는 것이다.  때문에 처음에는 최대한 내부 Function이나 Trigger를 두지 않고 차라리 history테이블을 하나 더 만드려고 했다. 하지만 테이블 field에 row가 생성된 날짜, 생성한 user 이외에 row의 데이터에 변경이 일어났을 때도 기록하기 위해 updated_at, updated_by field를 추가하려고 했더니  postgre에는 데이터 갱신 날짜를 추적해주는 함수는 없었다. 그래서 데이터 갱신용 function과 trigger를 만들었다. A 테이블에서 ROW 데이터를 갱신시, 언제, 누군가에 의해 갱신됐는지도 기록하려한다면 A 테이블에 ROW 데이터를 갱신시 TRIGGER 될 TRIGGER를 만들어야한다. 그리고 그 A 테이블에 걸린 TRIGGER가 실행할 FUNCTION을 만들어야한다. 1. TRIGGER가 실행할 FUNCTION에 맞는 FIELD 설정에 맞는 테이블 생성 2. TRIGGER가 실행할 FUNCTION 생성 3. TRIGGER 생성 FUNCTION의 재사용 A 테이블 이외의 B,C,D,...등의 테이블에도 똑같은 로직이 필요하다고 한다면 FUNCTION을 그대로 두고 TRIGGER를 해당 테이블에 걸어주면 된다. $$ 표현 create or replace function update_history() returns trigger as $$ begin new.updated_at = NOW(); new.updated_user = CURRENT_USER; return new; end; $$ language plpgsql; 여기서 $$표현은 FUNCTION을 정의할 때 시작과 끝...

Dbeaver postgresql Role 미설정으로 인한 로그인 오류

이미지
Dbeaver에서 프로젝트를 만들고 postgreDB로 connection 설정시, 로그인 오류가 발생할 때가 있다. (pgjdbc: autodetected server-encoding to be ISO-8859-1, if the message is not readable, please check database logs and/or host, port, dbname, user, password, pg_hba.conf) 원인 텍스트가 깨져서 보이기 때문에 텍스트 인코딩 문제같다고 생각했지만, 접근 권한 에러다. 서버 인코딩이 ISO-8859-1로 감지되었을 뿐이다. 해결법 pgAdmin 프로그램에서 접근 제한 설정(Login/Group 설정)을 해주어야한다. 여러 DB서버들 중 PostgreSQL12 서버의 'postgres'라는 db에 접근할 때,    Superuser 권한을 가진 유저를 하나 생성한 뒤, 이 유저로 접근하면 접근권한에러를 피할 수 있다.  또는  pg_hba.conf 라는 configuration 파일에서 local connection에 대한 정보( IP와 권한 )를 추가한다.

postgresql - aggregate function, window function의 비교

 aggregate function(집계 함수) 집계를 도와주는 함수. 집계 결과가 1개의 row에 나타난다. avg(salary) window function(윈도우 함수) 집계를 도와주는 함수. 각 row단위 마다 결과를 보여준다. 윈도우 함수 뒤에는 항상  OVER  절을 사용한다.  이 규칙은 이 함수가 윈도우 함수로 처리할 것인지, 그렇지 않을 것인지를 구분하는 문법상 규칙이다.   네번째 칼럼은  depname  칼럼 값을 기준으로 그룹화된 자료의 평균값을 각 로우마다 보여준다. OVER  절에는 윈도우 함수의 계산 대상이 되는 로우들을 집합화하는 방법을 정의한다.  PARTITION BY 로 정의하는 목록은 같은 그룹인지, 다른 그룹인지 구분하는 기준으로 사용되고,  같은 그룹 내에서는 현재 로우 값도 포함해서 계산 된 윈도우 함수의 결과값을 공유 한다. SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; empsalary 테이블에서  depname 기준으로 그룹화하여 OVER (PARTITION BY depname)  depname, empno, salary, avg(salary) 값을 조회한다. -> 그룹화된 자료들의 평균값인 avg(salary) PostgreSQL에서는 Aggregate function을 만들고, aggregate function을 window function처럼 사용할 수 있다. 윈도우 프레임 조절 및 자세한 원리는 자습서 참조. https://postgresql.kr/docs/9.5/tutorial-window.html

postgresql - delete, truncate의 비교

   delete 명령어 행이 삭제될 때 리소스 소모가 truncate에 비해 상대적으로 크다. -> how? trigger가 걸려있다면 행이 삭제될때마다 실행된다. 이전에 할당된 영역은 삭제되어, 빈 테이블이나 클러스터에 남는다. -> why?  truncate명령어 테이블의 모든 데이터를 삭제한다. delete와 비교하여 상대적으로 빠르게 데이터를 삭제한다. rollback 정보를 만들지 않으며 즉시 커밋한다. 때문에 한 번 truncate를 수행하면 rollback 할 수 없다. 행을 삭제할 때 trigger가 걸려있더라고 trigger를 실행하지 않는다. Truncate 옵션 postgresql의 truncate 옵션에는 다음 4가지가 있다. - RESTART IDENTITY : 타깃 테이블에 걸려있는 시퀀스(자동증가 값)을 재시작하면서 테이블 정보를 모두 삭제 - CONTINUE IDENTITY : 시퀀스 값 리셋 X, 데이터만 모두 삭제 - CASCADE : 타깃 테이블의 데이터를 모두 삭제하고 이 테이블과 연결된 데이터가 다른 테이블에 있으면, 다른 테이블의 데이터도 모두 삭제. 외래키 기준으로 다른 테이블을 참조할 때. - RESTRICT : 타깃 테이블에 연결된 데이터가 하나라도 있으면 데이터를 삭제하지 않는다. Postgresql에서의 delete, truncate 비교 database 사용자 입장에서는 똑같이 데이터를 삭제하는 작업처럼 보인다. 내부적으로는 다르게 작동한다. DELETE를 수행하고나면 -database pages 안에 dead rows가 남는다. -dead rows의 dead pointer가 색인에 남는다. 반면 TRUNCATE를 수행하고 나면 dead rows, indices(색인)이 비워지고 table 통계가 초기화된다. 신규 테이블을 생성할 때의 설정값과 비슷하게 구성됨.  -> 정확하게 어떻게 구성되는지는 공식문서를 보고 비교 해봐야한다. TRUNCATE는 작업하는데 ...

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code 완주, 독후감

Blogger 커스터마이징 : CSS 수정 (sticky-header)