PL/Python3u 개요
PL/Python3U는 PostgreSQL에서 Python3 언어를 사용할 수 있도록 해주는 Extension 입니다.
PL/pgSQL과 마찬가지로 Function, Trigger, Procedure, Anonymous Block등에서 사용할 수 있습니다.
PL/Python3u의 가장 마지막 글자인 u는 Untrustred(신뢰할 수 없는)라는 의미를 가지고 있습니다.
신뢰할 수 없는 언어란, 의도하지 않은 동작을 하는 것이 아니라, 기능 사용에 제약이 없기 때문에 주의가 필요한 언어입니다.
위와 같은 제약사항 때문에, Superuser 권한을 가지고 있는 Role(User)에서만 사용이 가능합니다.
PostgreSQL과 PL/Python3u 데이터 타입 비교
Function등에서 데이터를 조회하고 수정하는 등 작업에 있어서, PostgreSQL의 데이터를 파이썬에서 선언한 변수에 담아야 하는 상황이 있을 수 있습니다.
이럴 때, oid같은 PostgreSQL에만 존재하는 데이터 타입은 어떤 형태로 선언을 해야할까요?
[데이터 타입 비교]
PostgreSQL Datatype | Python3 Variable Type |
bool | boolean |
small int | int |
bigint | int |
oid | int |
real | float |
double | float |
numeric | cdecimal |
bytea | bytes |
이외의 모든 데이터 타입 | str (Unicode encoding) |
반대로, 파이썬에서 처리한 결과를 PostgreSQL 함수의 Return 값으로 출력해야 한다면 어떤 데이터 타입을 써야할까요?
[리턴 타입]
PostgreSQL Return Type | Python3 |
boolean | 0 또는 값이 비어 있을 경우만 false로 인식 문자 'f'는 true로 인식 |
bytea | bytes |
NULL | None |
Array | List |
Multidimensional Array | List of Lists |
이외의 리턴 타입 | String (데이터 타입에 따라 str 또는 repr) |
PL/Python3u 설치 요구사항
Python3 버전 3.6 이상이 필요합니다.
Python3 설치 시 python3-libs를 설치 해주어야 합니다.
PYthon3를 소스 코드 컴파일 형태로 설치하실 경우, 컴파일 옵션에 --enable-shared 옵션이 들어가 있어야 PostgreSQL에서 Python3를 불러올 수 있는 동적 라이브러리 파일이 생성됩니다.
PL/Python3u 설치
PL/Python3u는 PostgreSQL 공식 Repository에 포함되어 있습니다.
Redhat 계열에서는 아래와 같이 설치 가능한 패키지를 확인할 수 있습니다.
[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
Installed Packages
postgresql14-plpython3.x86_64 14.7-1PGDG.rhel7 @pgdg14
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
저는 PostgreSQL 14.7 버전이 설치되어 있기 때문에 이에 맞는 버전으로 다운로드 하도록 하겠습니다.
그에 앞서, 어떤 의존성이 필요한지 확인 해보도록 하겠습니다.
버전을 확인하는 방법은 아래와 같습니다.
yum deplist 명령어를 사용하며, 패키지명-패키지버전 형태로 조회할 수 있습니다.
[root@postgres ~]# yum deplist postgresql14-plpython3-14.7-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.7-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.7-1PGDG.rhel7
provider: postgresql14.x86_64 14.7-1PGDG.rhel7
dependency: postgresql14-server(x86-64) = 14.7-1PGDG.rhel7
provider: postgresql14-server.x86_64 14.7-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
CentOS 7.9 버전에서 PostgreSQL 14.7 버전에 맞는 PL/Python3 패키지를 설치하기 위해서는 libpython이 3.6버전으로 dependency가 걸려있어서, 3.6.8 버전으로 설치가 필요합니다.
다른 버전의 파이썬과 연동하고 싶다면, 파이썬 소스를 빌드하여 동적 라이브러리 참고 대상을 바꿔치기 하거나 PL/Python3u를 다른 파이썬 버전과 함께 PostgreSQL 소스에서 빌드해야 합니다.
설치 해보도록 하겠습니다.
[root@postgres ~]# yum install postgresql14-plpython3-14.7-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.7-1PGDG.rhel7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================================================================
Installing:
postgresql14-plpython3 x86_64 14.7-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.7-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.7-1PGDG.rhel7.x86_64 1/1
Verifying : postgresql14-plpython3-14.7-1PGDG.rhel7.x86_64 1/1
Installed:
postgresql14-plpython3.x86_64 0:14.7-1PGDG.rhel7
Complete!
python3-libs를 함께 설치 하셨다면, ldconfig를 이용해서 현재 Python3의 동적 라이브러리가 정상적으로 동작하고 있는지 확인할 수 있습니다.
[root@postgres ~]# ldconfig -p | grep python
libpython3.6m.so.1.0 (libc6,x86-64) => /lib64/libpython3.6m.so.1.0
libpython3.so (libc6,x86-64) => /lib64/libpython3.so
libpython2.7.so.1.0 (libc6,x86-64) => /lib64/libpython2.7.so.1.0
데이터베이스 기동 유저로 변경한 다음, plpython을 정상적으로 인식할 수 있도록 LD_LIBRARY_PATH를 지정 해주고, 변경사항을 적용합니다.
[root@postgres ~]# su - postgres
Last login: Wed Sep 20 17:54:55 KST 2023 on pts/0
[postgres@postgres:~]$ cat << EOF >> ~/.bash_profile
export LD_LIBRARY_PATH=/usr/pgsql-14/lib:\$LD_LIBRARY_PATH
EOF
[postgres@postgres:~]$ source ~/.bash_profile
PostgreSQL을 기동합니다.
기존에 기동중이라면 LD_LIBRARY_PATH 추가 이후에 재기동이 필요합니다.
기동 전에 이미 해당 경로가 설정되어 있었다면 재기동 하지 않으셔도 괜찮습니다.
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
plpython3u 익스텐션을 생성합니다.
postgres=# CREATE EXTENSION plpython3u;
CREATE EXTENSION
plpython3u가 잘 설치 되었는지, 어떤 버전의 파이썬과 연동되어 있는지 Anonymous Block을 이용하여 확인합니다.
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
Python의 print는 출력이 불가능하며, plpy.notice등 DBMS가 사용하는 로그 방식을 사용하여야 합니다.
주의사항
아래와 같이 환경 변수를 이용해여 데이터베이스 클러스터 디렉토리를 찾고, 삭제할 수 있는 등 PostgreSQL을 기동하는 OS 유저가 가진 모든 권한을 사용할 수 있으므로 주의가 필요합니다.
아래의 Anonymous Block은 PGDATA 디렉토리를 삭제시키므로 데이터베이스 백업 이후 테스트 하시길 바랍니다!!
DO $$
import os
datadir=os.getenv('PGDATA')
os.system('rm -rf '+datadir)
return datadir
$$ LANGUAGE plpython3u;
'PostgreSQL > Extension' 카테고리의 다른 글
system_stats (0) | 2023.11.22 |
---|