Python 图片存入数据库——高效存储和方便调用 (python 图片存入数据库优势)

在现代人们的日常生活中,图片已成为重要的信息载体之一,广泛应用于各种场景中。而对于开发人员来说,存储和调用这些图片也成为了一个必须要面对的问题。

传统的做法是将图片存储在文件系统中,然后再通过文件路径来引用图片。但是,这种做法虽然简单,但也存在一些问题,比如:

1. 维护难度高:需要手动管理图片的存储路径、文件名甚至文件夹结构。

2. 可读性差:当项目规模变大时,会因为图片存储路径的变化而导致代码失效。

3. 扩展性差:如果需要在多个系统或服务器之间共享图片,那么就需要手动拷贝和同步图片,很不方便。

这些问题都可以通过将图片存储在数据库中得到解决。接下来,我们就来介绍一下利用 Python 将图片存储在数据库中的方法。

1. 准备工作

在开始存储图片之前,我们需要先准备好数据库和相应的表结构。本文以 MySQL 为例来介绍如何存储图片。我们需要在 MySQL 中创建一个名为 “images” 的数据库,并在该数据库中创建一个名为 “picture” 的表。

CREATE DATABASE images;

USE images;

CREATE TABLE picture (

id INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(50),

type VARCHAR(50),

data LONGBLOB

);

在上面的 SQL 语句中,我们创建了一个包含四个字段的 “picture” 表,其中:

– id:图片唯一标识符,采用自增长的方式生成。

– name:图片名称,用于在数据库中区分不同的图片。

– type:图片类型,通常为 image/png、image/jpg 等。

– data:存储图片二进制数据的字段。

2. 图片上传

有了表结构之后,接下来就可以利用 Python 将图片上传到数据库中。我们可以使用 Python 中的 pymysql 模块来连接 MySQL 数据库,并使用 Python 的 Pillow 库来读取和处理图片。代码如下:

import pymysql.cursors

from PIL import Image

# 连接数据库

connection = pymysql.connect(host=’localhost’,

user=’root’,

password=’password’,

db=’images’,

charset=’utf8mb4′,

cursorclass=pymysql.cursors.DictCursor)

# 打开图片文件

with open(‘image.jpg’, ‘rb’) as f:

image_data = f.read()

# 转换图片格式

image = Image.open(‘image.jpg’)

if image.format != ‘PNG’:

image = image.convert(‘RGB’)

image_data_png = io.BytesIO()

image.save(image_data_png, format=’PNG’)

image_data_png = image_data_png.getvalue()

# 上传图片到数据库

try:

with connection.cursor() as cursor:

# SQL 插入语句

sql = “INSERT INTO `picture` (`name`, `type`, `data`) VALUES (%s, %s, %s)”

# 执行 SQL 语句

cursor.execute(sql, (‘image.jpg’, ‘image/png’, image_data_png))

# 提交到数据库

connection.commit()

finally:

# 关闭数据库连接

connection.close()

在上面的代码中,我们首先使用 pymysql 模块连接到 MySQL 数据库,并打开要上传的图片文件。然后,我们使用 Python 的 Pillow 库处理图片,将图片转换为 PNG 格式,并将转换后的图片二进制数据存储在一个 BytesIO 对象中。我们将图片的名称、类型和二进制数据插入到图片表中。

3. 图片查询

有了图片上传功能之后,我们还需要能够方便地查询和调用图片。我们可以编写一个 Python 函数,通过图片的名称或唯一标识符来从数据库中查询图片的二进制数据,并将其转换为图片对象。代码如下:

def get_image(name=None, id=None):

# 连接数据库

connection = pymysql.connect(host=’localhost’,

user=’root’,

password=’password’,

db=’images’,

charset=’utf8mb4′,

cursorclass=pymysql.cursors.DictCursor)

# 构造 SQL 查询语句

if name:

sql = “SELECT * FROM `picture` WHERE `name`=%s”

value = name

elif id:

sql = “SELECT * FROM `picture` WHERE `id`=%s”

value = id

else:

rse ValueError(“Either name or id must be specified.”)

# 执行查询

with connection.cursor() as cursor:

cursor.execute(sql, (value,))

result = cursor.fetchone()

# 转换图片格式

image_data = io.BytesIO(result[‘data’])

image = Image.open(image_data)

# 关闭数据库连接

connection.close()

return image

在上面的代码中,我们编写了一个名为 get_image 的函数,该函数可以接受一个图片的名称或唯一标识符(id)作为参数,并通过 SQL 查询语句从数据库中获取图片的二进制数据。然后,我们将二进制数据转换为图片对象,并返回该图片对象。

4. 结论

在本文中,我们介绍了如何使用 Python 将图片存储在数据库中,并通过 Python 函数方便地从数据库中查询和调用图片。相对于传统的文件系统存储方式,数据库存储方式具有维护难度低、可读性高、扩展性强等优点,对于大规模的图片存储和调用场景尤为适用。在实际开发中,我们可以根据实际需求来选择具体的数据库以及对应的 Python 模块,并适当地优化存储和查询性能。


数据运维技术 » Python 图片存入数据库——高效存储和方便调用 (python 图片存入数据库优势)