В этой статье мы увидим, как сохранять файлы изображений в базе данных postgresql с помощью Python.
Psycopg2 — это драйвер, который используется для взаимодействия с данными Postgres с использованием языка сценариев Python. Он используется для выполнения операций CRUD с данными Postgres.
Данные, обрабатываемые в приложениях, могут быть в любом формате. Например, строки, числа и так далее. Время от времени нам нужно загружать изображения на столы. В этой статье давайте научимся загружать изображения в Postgres с помощью Python.
Формат BLOB и BYTEA
Обычно поля изображения представляют собой типы данных BLOB. BLOB — это большие двоичные объекты, которые используются для хранения огромных объемов данных. Изображения, аудио и видео файлы обычно хранятся в виде BLOB в базах данных. SQL, MySQL и другие базы данных поддерживают тип данных BLOB. Но Postgres не поддерживает формат BLOB. Вместо этого он имеет формат BYTEA для обработки двоичных данных. BYTEA не подходит для хранения больших объемов данных. Столбец данных типа BYTEA может хранить до 1 ГБ данных.
Давайте посмотрим, какие шаги необходимо предпринять для загрузки изображений в таблицу Postgres —
- Рассмотрим базу данных CartoonDB с таблицей Cartoon. В нем есть поля cartoonID, name, cartoonImg. Поле cartoon будет иметь тип INTEGER, имя будет TEXT, а cartoonImg будет иметь тип данных BYTEA.
- Для выполнения операций CRUD с данными Postgres с использованием кода Python нам понадобится библиотека psycopg2. Следовательно, установите его, используя команду «pip install psycopg2» на терминале.
- Адаптер psycopg2 имеет метод connect (), который позволяет подключаться к базе данных, передавая имя пользователя, пароль, имя хоста и порт в качестве параметров. Мы также можем передать имя базы данных. Он возвращает действительный объект соединения при успешном соединении.
- Используя объект подключения, мы можем создать объект курсора, который действует как указатель на базу данных. Мы можем использовать объект курсора для запуска SQL-запросов к данным таблицы. Используя его, мы создадим и загрузим записи изображений в таблицу.
Код для того же, как указано ниже —
Python3
# Import the required library
import
psycopg2
# Method to create a connection object
# It creates a pointer cursor to the database
# and returns it along with Connection object
def
create_connection():
# Connect to the database
# using the psycopg2 adapter.
# Pass your database name ,# username , password ,
# hostname and port number
conn
=
psycopg2.connect(dbname
=
'DisneyDB'
,
user
=
'postgres'
,
password
=
'admin'
,
host
=
'localhost'
,
port
=
'5432'
)
# Get the cursor object from the connection object
curr
=
conn.cursor()
return
conn, curr
def
create_table():
try
:
# Get the cursor object from the connection object
conn, curr
=
create_connection()
try
:
# Fire the CREATE query
curr.execute("CREATE TABLE IF NOT EXISTS \
cartoon(cartoonID INTEGER, name TEXT,\
cartoonImg BYTEA)")
except
(Exception, psycopg2.Error) as error:
# Print exception
(
"Error while creating cartoon table"
, error)
finally
:
# Close the connection object
conn.commit()
conn.close()
finally
:
# Since we do not have to do anything here we will pass
pass
def
write_blob(cartoonID,file_path,name):
try
:
# Read data from a image file
drawing
=
open
(file_path,
'rb'
).read()
# Read database configuration
conn, cursor
=
create_connection()
try
:
# Execute the INSERT statement
# Convert the image data to Binary
cursor.execute("INSERT INTO cartoon\
(cartoonID,name,cartoonImg) "
+
"VALUES(%s,%s,%s)"
,
(cartoonID,name, psycopg2.Binary(drawing)))
# Commit the changes to the database
conn.commit()
except
(Exception, psycopg2.DatabaseError) as error:
(
"Error while inserting data in cartoon table"
, error)
finally
:
# Close the connection object
conn.close()
finally
:
# Since we do not have to do
# anything here we will pass
pass
# Call the create table method
create_table()
# Prepare sample data, of images, from local drive
write_blob(
1
,
"F:\\TeachPytho\\GFGPhotos\\casper.jpg"
,
"Casper"
)
write_blob(
2
,
"F:\\TeachPytho\\GFGPhotos\\archie.jpg"
,
"Archie"
)
write_blob(
3
,
"F:\\TeachPytho\\GFGPhotos\\tintin.png"
,
"Tintin"
)
write_blob(
4
,
"F:\\TeachPytho\\GFGPhotos\\pikachu.jpg"
,
"Pikachu"
)
write_blob(
5
,
"F:\\TeachPytho\\GFGPhotos\\kungfupanda.jpg"
,
"Kung Fu Panda"
)
После выполнения кода мы можем просмотреть данные в инструменте PgAdmin4. Данные таблицы показаны ниже: