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 模块,并适当地优化存储和查询性能。