Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] PL/Python3U

[OpenSQL] PL/Python3U

PL/Python3U 개요

Pg란?

The PL/Python procedural language allows PostgreSQL functions and procedures to be written in the Python language.

  • PostgreSQL 공식 매뉴얼 PL/Python3 –

PL/Python3U는 PostgreSQL에서 Python3 언어를 사용할 수 있도록 해주는 Extension 입니다.
PL/pgSQL과 마찬가지로 Function, Trigger, Procedure, Anonymous Block등에서 사용할 수 있습니다.

왜 PL/Python3 뒤에 u가 붙나요??

PL/Python3u의 가장 마지막 글자인 u는 **Untrustred(신뢰할 수 없는)**라는 의미를 가지고 있습니다.
신뢰할 수 없는 언어란, 의도하지 않은 동작을 하는 것이 아니라, 기능 사용에 제약이 없기 때문에 주의가 필요한 언어입니다.

위와 같은 제약사항 때문에, Superuser 권한을 가지고 있는 Role(User)에서만 사용이 가능합니다.

왜 PL/Python3 뒤에 u가 붙나요??

PL/Python3u의 가장 마지막 글자인 u는 **Untrustred(신뢰할 수 없는)**라는 의미를 가지고 있습니다.
신뢰할 수 없는 언어란, 의도하지 않은 동작을 하는 것이 아니라, 기능 사용에 제약이 없기 때문에 주의가 필요한 언어입니다.

위와 같은 제약사항 때문에, Superuser 권한을 가지고 있는 Role(User)에서만 사용이 가능합니다.

PL/Python3U 버전 호환성 확인

PostgreSQL 공식 Repository에서 다운로드 할 수 있으며, PostgreSQL EOS와 동일한 패키지가 존재합니다.
소스 설치 시 아래에 명시한 버전보다 아래의 PostgreSQL 버전에도 PL/Python을 설치할 수 있습니다.

Python 버전3.6 이상
PostgreSQL 버전11.0 이상

PL/Python3U 다운로드


PostgreSQL 공식 Repository에서 다운로드 할 수 있으며, PostgreSQL EOS와 동일한 패키지가 존재합니다.
Python3 설치 시 python3-libs를 설치 해주어야 합니다.

PYthon3를 소스 코드 컴파일 형태로 설치하실 경우, 컴파일 옵션에 –enable-shared 옵션이 들어가 있어야 PostgreSQL에서 Python3를 불러올 수 있는 동적 라이브러리 파일이 생성됩니다

PostgreSQL Official Yum repository에서 원하는 PostgreSQL 버전에 맞는 PL/Python3U를 설치할 수 있습니다.

Index of /pub/repos/yum/

아래의 링크는 Redhat 계열의 Linux 버전 7을 사용하는 경우 PostgreSQL-14.2 버전에 맞는 패키지입니다.

https://ftp.postgresql.org/pub/repos/yum/14/redhat/rhel-7-x86_64/postgresql14-plpython3-14.2-1PGDG.rhel7.x86_64.rpm

PL/Python3U 설치

Linux(CentOS7) 환경에서 설치를 해보도록 하겠습니다.
python3 및 python3-libs는 CentOS7 설치시에 최소 패키지로 포함되어 있으므로 설치하는 방법은 넘어가도록 하겠습니다.

Linux (CentOS 7)에 설치

설치 시 필요한 패키지 목록

[opensql@postgres:~]$ yum deplist postgresql14-plpython3-14.2-1PGDG.rhel7
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

  • base: mirror.kakao.com
  • centos-sclo-rh: mirror.kakao.com
  • epel: mirror-nrt.yuki.net.uk
  • extras: mirror.kakao.com
  • updates: mirror.kakao.com
    package: postgresql14-plpython3.x86_64 14.2-1PGDG.rhel7
    dependency: libc.so.6(GLIBC_2.14)(64bit)
    provider: glibc.x86_64 2.17-326.el7_9
    dependency: libpthread.so.0()(64bit)
    provider: glibc.x86_64 2.17-326.el7_9
    dependency: libpthread.so.0(GLIBC_2.2.5)(64bit)
    provider: glibc.x86_64 2.17-326.el7_9
    dependency: libpython3.6m.so.1.0()(64bit)
    provider: python3-libs.x86_64 3.6.8-19.el7_9
    dependency: postgresql14(x86-64) = 14.2-1PGDG.rhel7
    provider: postgresql14.x86_64 14.2-1PGDG.rhel7
    dependency: postgresql14-server(x86-64) = 14.2-1PGDG.rhel7
    provider: postgresql14-server.x86_64 14.2-1PGDG.rhel7
    dependency: python3-libs
    provider: python3-libs.x86_64 3.6.8-19.el7_9
    provider: python3-libs.i686 3.6.8-19.el7_9
    dependency: rtld(GNU_HASH)
    provider: glibc.x86_64 2.17-326.el7_9
    provider: glibc.i686 2.17-326.el7_9

postgresql-14.2 기준 아래의 패키지들이 필요합니다.

  • glibc
  • python3-libs
  • postgresql14-14.2-1PGDG.rhel7
  • postgresql14-server-14.2-1PGDG.rhel7

PGDG Repo 이용 설치

1.plpython3u 패키지 목록 확인

[root@postgres:~]$ yum list postgresql14-plpython3 –show-duplicates
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

  • base: mirror.kakao.com
  • centos-sclo-rh: mirror.kakao.com
  • epel: mirror-nrt.yuki.net.uk
  • extras: mirror.kakao.com
  • updates: mirror.kakao.com
    Available Packages
    postgresql14-plpython3.x86_64 14.0-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.1-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.2-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.3-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.4-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.5-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.6-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.7-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.8-1PGDG.rhel7 pgdg14
    postgresql14-plpython3.x86_64 14.9-2PGDG.rhel7 pgdg14

2.plpython3u 패키지를 설치합니다.

[root@postgres ~]# yum install postgresql14-plpython3-14.2-1PGDG.rhel7
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

  • base: mirror.kakao.com
  • centos-sclo-rh: mirror.kakao.com
  • epel: mirror-nrt.yuki.net.uk
  • extras: mirror.kakao.com
  • updates: mirror.kakao.com
    Resolving Dependencies
    –> Running transaction check
    —> Package postgresql14-plpython3.x86_64 0:14.2-1PGDG.rhel7 will be installed
    –> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================================================================================================================

#Package Arch Version Repository Size

Installing:
postgresql14-plpython3 x86_64 14.2-1PGDG.rhel7 pgdg14 89 k

#Transaction Summary

Install 1 Package

Total download size: 89 k
Installed size: 323 k
Is this ok [y/d/N]: y
Downloading packages:
postgresql14-plpython3-14.2-1PGDG.rhel7.x86_64.rpm | 89 kB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : postgresql14-plpython3-14.2-1PGDG.rhel7.x86_64 1/1
Verifying : postgresql14-plpython3-14.2-1PGDG.rhel7.x86_64 1/1

Installed:
postgresql14-plpython3.x86_64 0:14.2-1PGDG.rhel7

Complete!

PL/Python3U 사용 방법

PL/Python3U 사용 방법 – Linux(CentOS 7)

사용방법 실습 환경
아래와 같은 환경에서 PGX를 사용 해보는 실습을 진행하겠습니다.

OSCentOS 7.9
PostgreSQL VersionPostgreSQL 14.2
Python Version3.6.8

실습 순서

1.LD_LIBRARY_PATH 환경변수에 PostgreSQL LIB 디렉토리가 포함되도록 .bash_profile을 변경합니다

[root@postgres ~]# su – opensql

[opensql@postgres:~]$ cat << EOF >> ~/.bash_profile
export LD_LIBRARY_PATH=/usr/pgsql-14/lib:$LD_LIBRARY_PATH
EOF

2.데이터베이스를 기동합니다.

[opensql@postgres:~]$ pg_ctl start -D $PGDATA
waiting for server to start….2023-09-20 18:03:43.982 KST [14111] LOG: redirecting log output to logging collector process
2023-09-20 18:03:43.982 KST [14111] HINT: Future log output will appear in directory “/opensql/pg/14/log/pg_log”.
done
server started

3.데이터베이스에 CREATE EXTENSION 명령어를 수행하여 Extension을 설치합니다.

[opensql@postgres:~]$ psql postgres
psql (14.7)
Type “help” for help.

postgres=# CREATE EXTENSION plpython3u;
CREATE EXTENSION

4./Python3U를 Anonymous 블록을 이용하여 실행해봅니다.

postgres=#
DO $$
import sys
plpy.notice(sys.version)
$$ LANGUAGE plpython3u;
NOTICE: 3.6.8 (default, Nov 16 2020, 16:55:22)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
DO

주의사항

아래와 같이 환경 변수를 이용해여 데이터베이스 클러스터 디렉토리를 찾고, 삭제할 수 있는 등 PostgreSQL을 기동하는 OS 유저가 가진 모든 권한을 사용할 수 있으므로 주의가 필요합니다.
아래의 Anonymous Block은 PGDATA 디렉토리를 삭제시키므로 데이터베이스 백업 이후 테스트 하시길 바랍니다!!

DO $$
import os
datadir=os.getenv(‘PGDATA’)
os.system(‘rm -rf ‘+datadir)
return datadir
$$ LANGUAGE plpython3u;

PL/Python3u 에 대한 더욱 자세한 정보는 아래의 공식 매뉴얼을 확인 해주시기 바랍니다.

https://www.postgresql.org/docs/14/plpython.html

지금까지 PostgreSQL의 PL/Python3U에 관해 알아보았습니다

PostgreSQL의 pgbouncer’를 바로 이어서 확인해보세요!

광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •