PostgreSQL Python 教程: 处理 BLOB 数据

八月 14, 2023

摘要:在本教程中,您将学习如何在 Python 中处理 PostgreSQL BLOB 数据。

SQL 标准将 BLOB 定义为用于在数据库中存储二进制数据的二进制大对象。使用 BLOB 数据类型,您可以将图片、文档等内容存储到表中。

PostgreSQL 不支持 BLOB,但您可以使用 BYTEA 数据类型来存储二进制数据。

我们来看一下part_drawings表。

parts_part_drawings_tables

part_drawings表在drawing_data列中存储了部件的图片。我们将向您展示如何将二进制数据插入此列并将其读回。

将 BLOB 插入表中

要将 BLOB 数据插入表中,请使用以下步骤:

  1. 首先,从文件中读取数据。
  2. 接下来,通过从connect()函数创建新的连接对象来连接到 PostgreSQL 数据库
  3. 然后,从该connection对象创建一个cursor对象。
  4. 之后,使用输入值执行 INSERT 语句。对于 BLOB 数据,您需要使用 psycopg 模块的Binary对象。
  5. 最后,通过调用connection对象的commit()方法,将更改永久提交到 PostgreSQL 数据库。

下面的write_blob()函数,从path_to_file参数指定的文件中读取二进制数据,并将其插入到part_drawings表中。

#!/usr/bin/python
import psycopg2
from config import config

def write_blob(part_id, path_to_file, file_extension):
    """ insert a BLOB into a table """
    conn = None
    try:
        # read data from a picture
        drawing = open(path_to_file, 'rb').read()
        # read database configuration
        params = config()
        # connect to the PostgresQL database
        conn = psycopg2.connect(**params)
        # create a new cursor object
        cur = conn.cursor()
        # execute the INSERT statement
        cur.execute("INSERT INTO part_drawings(part_id,file_extension,drawing_data) " +
                    "VALUES(%s,%s,%s)",
                    (part_id, file_extension, psycopg2.Binary(drawing)))
        # commit the changes to the database
        conn.commit()
        # close the communication with the PostgresQL database
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

下面的代码片段调用write_blob()函数两次,以将两个新部件和相应图片文件的二进制数据插入到part_drawings表中。

if __name__ == '__main__':
    write_blob(1, 'images/simtray.jpg', 'jpg')
    write_blob(2, 'images/speaker.jpg', 'jpg')

读取表中的 BLOB

从表中读取 BLOB 的步骤与从表中查询数据的步骤类似。从表中获取二进制数据后,我们可以保存到文件、输出到网络浏览器等。

下面的read_blob()函数根据指定的部件 ID 从part_drawings表中查询 BLOB 数据,并将 BLOB 数据保存到文件中。

def read_blob(part_id, path_to_dir):
    """ read BLOB data from a table """
    conn = None
    try:
        # read database configuration
        params = config()
        # connect to the PostgresQL database
        conn = psycopg2.connect(**params)
        # create a new cursor object
        cur = conn.cursor()
        # execute the SELECT statement
        cur.execute(""" SELECT part_name, file_extension, drawing_data
                        FROM part_drawings
                        INNER JOIN parts on parts.part_id = part_drawings.part_id
                        WHERE parts.part_id = %s """,
                    (part_id,))

        blob = cur.fetchone()
        open(path_to_dir + blob[0] + '.' + blob[1], 'wb').write(blob[2])
        # close the communication with the PostgresQL database
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

以下代码片段读取 id 值为 1 和 2 的部件的二进制数据,并将二进制数据保存到文件夹images/blob中。

在本教程中,您学习了如何在 Python 中使用 psycopg 数据库适配器处理 PostgreSQL BLOB 数据。