[파이썬] Psycopg2에서 BLOBs 및 LOBs 저장 및 검색

Psycopg2는 Python에서 PostgreSQL 데이터베이스에 연결하기 위한 강력한 라이브러리입니다. 이 라이브러리를 사용하면 Python 프로그램에서 PostgreSQL 데이터베이스의 BLOBs(이진 데이터 객체) 및 LOBs(큰 객체)를 저장하고 검색할 수 있습니다. 이 글에서는 Psycopg2를 사용하여 BLOBs 및 LOBs를 저장하고 검색하는 방법을 알아보겠습니다.

BLOBs 저장

BLOBs를 저장하려면 데이터를 바이트로 변환하고, Psycopg2의 cursor.execute() 메서드를 사용하여 INSERT 문을 실행해야 합니다. 다음은 BLOBs를 저장하는 예시입니다:

import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

# PostgreSQL 데이터베이스에 연결
connection = psycopg2.connect(dbname='mydatabase', user='myuser', password='mypassword', host='localhost')
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cursor = connection.cursor()

# BLOBs 데이터
blob_data = b'My binary data'

# BLOBs 저장
cursor.execute("INSERT INTO mytable (blob_column) VALUES (%s)", (psycopg2.Binary(blob_data),))

# 커밋
connection.commit()

# 연결 닫기
cursor.close()
connection.close()

위 예시에서는 psycopg2.Binary() 함수를 사용하여 BLOB 데이터를 바이트로 변환하여 INSERT 문에 전달합니다. 이후 데이터베이스 커밋을 통해 변경 내용을 영구 저장합니다.

BLOBs 검색

BLOBs를 검색하려면 SELECT 문을 사용하여 데이터베이스에서 BLOB 열을 가져옵니다. 다음은 BLOBs를 검색하는 예시입니다:

import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

# PostgreSQL 데이터베이스에 연결
connection = psycopg2.connect(dbname='mydatabase', user='myuser', password='mypassword', host='localhost')
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cursor = connection.cursor()

# BLOBs 검색
cursor.execute("SELECT blob_column FROM mytable")
result = cursor.fetchone()

# BLOBs 데이터 출력
blob_data = result[0]
print(blob_data)

# 연결 닫기
cursor.close()
connection.close()

위 예시에서는 SELECT 문을 사용하여 BLOB 열을 가져옵니다. fetchone() 메서드를 사용하여 결과를 가져오고, 결과의 첫 번째 열을 BLOB 데이터로 저장합니다. 이후에는 필요에 따라 BLOB 데이터를 처리하거나 출력할 수 있습니다.

LOBs(큰 객체) 저장

LOBs, 특히 큰 BLOBs의 경우, Psycopg2에서 Python file 객체를 사용하여 저장하고 검색하는 것이 유용합니다. 다음은 LOBs를 저장하는 예시입니다:

import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

# PostgreSQL 데이터베이스에 연결
connection = psycopg2.connect(dbname='mydatabase', user='myuser', password='mypassword', host='localhost')
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cursor = connection.cursor()

# LOBs 데이터
lob_data = open('my_file.jpg', 'rb')

# LOBs 저장
cursor.execute("INSERT INTO mytable (lob_column) VALUES (%s)", (psycopg2.Binary(lob_data.read()),))

# 커밋
connection.commit()

# 연결 닫기
cursor.close()
connection.close()

위 예시에서는 open() 함수를 사용하여 파일을 열고, rb 모드를 사용하여 파일을 이진 모드로 읽습니다. 그런 다음 read() 메서드를 사용하여 데이터를 읽고 psycopg2.Binary() 함수를 사용하여 BLOB로 변환하여 INSERT 문에 전달합니다.

LOBs(큰 객체) 검색

LOBs(큰 객체)를 검색하기 위해서는 SELECT 문을 사용하여 데이터베이스에서 LOB 열을 가져옵니다. 다음은 LOBs를 검색하는 예시입니다:

import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

# PostgreSQL 데이터베이스에 연결
connection = psycopg2.connect(dbname='mydatabase', user='myuser', password='mypassword', host='localhost')
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cursor = connection.cursor()

# LOBs 검색
cursor.execute("SELECT lob_column FROM mytable")
result = cursor.fetchone()

# LOBs 데이터 저장
lob_data = result[0]

# LOBs 데이터를 파일로 저장
with open('retrieved_file.jpg', 'wb') as f:
    f.write(lob_data)

# 연결 닫기
cursor.close()
connection.close()

위 예시에서는 fetchone() 메서드를 사용하여 LOB 열을 가져옵니다. 결과의 첫 번째 열을 LOB 데이터로 저장한 후, open() 함수를 사용하여 파일을 쓰기 이진 모드로 열어 LOB 데이터를 파일에 저장합니다.


이제 Psycopg2를 사용하여 BLOBs 및 LOBs를 PostgreSQL 데이터베이스에 저장하고 검색하는 방법을 알았습니다. 이 기능을 사용하여 이미지, 오디오, 비디오 등과 같은 이진 데이터를 효율적으로 관리할 수 있습니다. 만약 PostgreSQL을 사용하는 경우, Psycopg2 라이브러리는 이러한 요구사항에 대한 강력한 솔루션을 제공합니다.