В этой статье мы узнаем, как обрабатывать данные BLOB PostgreSQL в Python.
- BLOB — это большой двоичный объект (BLOB)— это тип данных, который может хранить любые двоичные данные.
- Чтобы хранить данные BLOB в базе данных PostgreSQL, нам нужно использовать тип данных Binary Large Object (BLOB).
- Используя тип данных Binary Large Object (BLOB), мы можем хранить любые двоичные данные в базе данных PostgreSQL.
Различные типы данных BLOB, которые мы можем хранить в базе данных: [Расширение]:
- .png
- .jpg
- .gif
- .docx
- .xlsx
- .mp4,.mp3 … и т. д.
psycopg2 — это модуль Python, который позволяет нам подключаться к базе данных PostgreSQL и хранить данные BLOB.
BLOB-тип данных
BLOB (двоичный большой объект) — это двоичная строка переменной длины. И эта строка будет храниться в базе данных как тип данных bytea ( массив байтов ).
Таблица для хранения данных BLOB в PostgreSQL называется таблицей больших объектов, а тип данных — bytea.
psycopg2.Binary(File_in_Bytes)
Обработка данных PostgreSQL BLOB в Python
Операция чтения и записи в двоичном формате
Чтобы прочитать или записать файл (например, изображение) в двоичном формате, мы можем использовать функцию open(). Где «rb» для чтения двоичных файлов, а «wb» для записи двоичных файлов.
open(FileName, 'rb').read() # 'rb' stands for Read Binary open(FileName, 'wb').write(BLOB) # 'wb' stands for Write Binary
Таблица для хранения BLOB
Пусть имя таблицы будет blob_datastore и тип данных:
- Для хранения имени файла мы будем использовать характерныйтип данных.
- Для хранения типа данных BLOB мы будем использовать тип данных bytea.
Обработка данных PostgreSQL BLOB
Полная функция для вставки данных BLOB в базу данных
Здесь мы вставляем данные BLOB в базу данных после установления соединения с базой данных с помощью функции.execute(), мы вставляем необходимые значения.
Python3
import
psycopg2
from
config
import
config
# This Function will open & convert the image or file data to binary data.
def
convert_To_Binary(filename):
with
open
(filename,
'rb'
) as
file
:
data
=
file
.read()
return
data
def
insert_BLOB(S_No, FileName):
""" insert a BLOB into a table """
conn
=
None
try
:
# connect to the PostgreSQL server & creating a cursor object
conn
=
psycopg2.connect(
*
*
config)
# Creating a cursor with name cur.
cur
=
conn.cursor()
# Binary Data
file_data
=
convert_To_Binary(FileName)
# BLOB DataType
BLOB
=
psycopg2.Binary(file_data)
# SQL query to insert data into the database.
cur.execute(
"INSERT INTO blob_datastore(s_no,file_name,blob_data) VALUES(%s,%s,%s)"
, (S_No, FileName, BLOB))
# Close the connection
cur.close()
except
(Exception, psycopg2.DatabaseError) as error:
(error)
finally
:
if
conn
is
not
None
:
# Commit the changes to the database
conn.commit()
insert_BLOB(
1
,
'newOcta.jpg'
)
Полная функция для извлечения данных BLOB в базу данных
Здесь мы извлекаем данные BLOB из базы данных после установления соединения с базой данных с помощью функции.execute(). Мы извлекаем все необходимые значения с помощью функции fetchall().
Python3
# Complete Function to Retrieve the BLOB data into the database.
import
psycopg2
from
config
import
config
# This Function will Creates File from binary data.
def
Binary_To_File(BLOB, FileName, oldFileName):
with
open
(f
"{FileName}"
,
'wb'
) as
file
:
file
.write(BLOB)
(f
"{oldFileName} File saved With Name name {FileName}"
)
def
retrieve_BLOB(S_No, newFileName):
""" Retrieve a BLOB From a table """
conn
=
None
try
:
# connect to the PostgreSQL server & creating a cursor object
conn
=
psycopg2.connect(
*
*
config)
# Creating a cursor with name cur.
cur
=
conn.cursor()
# Retrieve BLOB data from the database.
cur.execute(
'SELECT * FROM BLOB_DataStore'
)
db
=
cur.fetchall()
BLOB
=
db[S_No
-
1
][
2
]
# open("FromDB"+db[0][1], 'wb').write(BLOB)
Binary_To_File(BLOB, newFileName, db[S_No
-
1
][
1
])
# Close the connection
cur.close()
except
(Exception, psycopg2.DatabaseError) as error:
(error)
finally
:
if
conn
is
not
None
:
# Commit the changes to the database
conn.commit()
retrieve_BLOB(
1
,
'OctaFromDB.jpg'
)
Пример:
Сохранение всех файлов (Anima.mp4, BlobNotes.pdf, Octa.jpg, Type.gif) в таблице с именем blob_datastore и получение данных таблицы.
Обработка данных PostgreSQL BLOB
Код для вставки данных BLOB
Здесь мы в основном устанавливаем соединение с базой данных, затем создаем курсор и создаем таблицу и вставляем значения в соответствии с ее типом данных, то есть varchar, bytea и т. д., наконец, читаем большой файл в его двоичную форму и сохраняем в базе данных.
Python3
import
psycopg2
conn
=
None
try
:
# connect to the PostgreSQL server
conn
=
psycopg2.connect(
host
=
'localhost'
,
dbname
=
'For_Practice'
,
user
=
'postgres'
,
password
=
'321654'
,
port
=
5432
)
# Creating a cursor with name cur.
cur
=
conn.cursor()
cur.execute(
"CREATE TABLE blob_datastore (s_no serial, file_name VARCHAR ( 50 ), blob_data bytea)"
)
# SQL query to insert data into the database.
insert_script
=
'''
INSERT INTO blob_datastore(s_no,file_name,blob_data) VALUES (%s,%s,%s);
'''
# open('File,'rb').read() is used to read the file.
# where open(File,'rb').read() will return the binary data of the file.
# psycopg2.Binary(File_in_Bytes) is used to convert the binary data to a BLOB data type.
BLOB_1
=
psycopg2.Binary(
open
(
'files\Anima.mp4'
,
'rb'
).read())
# Video
BLOB_2
=
psycopg2.Binary(
open
(
'files\Octa.jpg'
,
'rb'
).read())
# Image
BLOB_3
=
psycopg2.Binary(
open
(
'files\Type.gif'
,
'rb'
).read())
# GIF
BLOB_4
=
psycopg2.Binary(
open
(
'files\BlobNotes.pdf'
,
'rb'
).read())
# And Finally we pass the above mentioned values to the insert_script variable.
insert_values
=
[(
1
,
'Anima.mp4'
, BLOB_1), (
2
,
'Octa.jpg'
, BLOB_2),
(
3
,
'Type.gif'
, BLOB_3), (
4
,
'BlobNotes.pdf'
, BLOB_4)]
# The execute() method with the insert_script & insert_value as argument.
for
insert_value
in
insert_values:
cur.execute(insert_script, insert_value)
(insert_value[
0
], insert_value[
1
],
"[Binary Data]"
,
"row Inserted Successfully"
)
# SQL query to fetch data from the database.
cur.execute(
'SELECT * FROM BLOB_DataStore'
)
# open(file,'wb').write() is used to write the binary data to the file.
for
row
in
cur.fetchall():
BLOB
=
row[
2
]
open
(
"new"
+
row[
1
],
'wb'
).write(BLOB)
(row[
0
], row[
1
],
"BLOB Data is saved in Current Directory"
)
# Close the connection
cur.close()
except
(Exception, psycopg2.DatabaseError) as error:
(error)
finally
:
if
conn
is
not
None
:
# Commit the changes to the database
conn.commit()
Выход:
Хранение данных:
Обработка данных PostgreSQL BLOB
Получение данных:
Обработка данных PostgreSQL BLOB