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를 설치할 수 있습니다.
아래의 링크는 Redhat 계열의 Linux 버전 7을 사용하는 경우 PostgreSQL-14.2 버전에 맞는 패키지입니다.
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 ResolutionDependencies 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/1Installed:
postgresql14-plpython3.x86_64 0:14.2-1PGDG.rhel7Complete!
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
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’를 바로 이어서 확인해보세요!