About
home
Tmax OpenSQL
home

(PL) 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/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를 설치할 수 있습니다.
아래의 링크는 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
JavaScript
복사

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
JavaScript
복사
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
Shell
복사
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!
Shell
복사

PL/Python3U 사용 방법

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

사용방법 실습 환경
아래와 같은 환경에서 PGX를 사용 해보는 실습을 진행하겠습니다.
OS
CentOS 7.9
PostgreSQL Version
PostgreSQL 14.2
Python Version
3.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
JavaScript
복사
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
JavaScript
복사
3.
데이터베이스에 CREATE EXTENSION 명령어를 수행하여 Extension을 설치합니다.
[opensql@postgres:~]$ psql postgres psql (14.7) Type "help" for help. postgres=# CREATE EXTENSION plpython3u; CREATE EXTENSION
Ruby
복사
4.
PL/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
Shell
복사

주의사항

아래와 같이 환경 변수를 이용해여 데이터베이스 클러스터 디렉토리를 찾고, 삭제할 수 있는 등 PostgreSQL을 기동하는 OS 유저가 가진 모든 권한을 사용할 수 있으므로 주의가 필요합니다.
아래의 Anonymous Block은 PGDATA 디렉토리를 삭제시키므로 데이터베이스 백업 이후 테스트 하시길 바랍니다!!
DO $$ import os datadir=os.getenv('PGDATA') os.system('rm -rf '+datadir) return datadir $$ LANGUAGE plpython3u;
JavaScript
복사
PL/Python3u 에 대한 더욱 자세한 정보는 아래의 공식 매뉴얼을 확인 해주시기 바랍니다.