Python Coding Academy
🐍 آموزش جامع Python — پست ۲۲۲
ذخیره دادههای باینری در SQLite با BLOB
تا اینجا بیشتر با دادههای متنی و عددی در SQLite کار کردیم.
اما گاهی لازم است دادههای باینری (Binary Data) مانند محتوای یک تصویر یا فایل را هم در Database ذخیره کنیم.
برای این کار از نوع داده BLOB استفاده میکنیم.
🔹 BLOB چیست؟
BLOB مخفف Binary Large Object است و برای نگهداری دادههای باینری استفاده میشود.
مثلاً:
محتوای تصویر
فایلهای کوچک
دادههای باینری تولیدشده توسط برنامه
🔹 ذخیره یک فایل در SQLite
فرض کنیم فایلی به نام image.png داریم.
import sqlite3
from pathlib import Path
image_data = Path("image.png").read_bytes()
with sqlite3.connect("files.db") as connection:
connection.execute("""
CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY,
filename TEXT NOT NULL,
content BLOB NOT NULL
)
""")
connection.execute(
"INSERT INTO files (filename, content) VALUES (?, ?)",
("image.png", image_data)
)
print("File saved")
در این مثال، read_bytes() محتوای فایل را به شکل bytes میخواند و SQLite آن را در ستون BLOB ذخیره میکند.
🔹 بازیابی فایل
برای دریافت دادهها و بازسازی فایل:
import sqlite3
from pathlib import Path
with sqlite3.connect("files.db") as connection:
row = connection.execute(
"SELECT content FROM files WHERE filename = ?",
("image.png",)
).fetchone()
if row is not None:
Path("restored.png").write_bytes(row[0])
print("File restored")
else:
print("File not found")
اگر رکورد وجود داشته باشد، فایل restored.png ساخته میشود.
🔹 چرا از ? استفاده میکنیم؟
در این دستور:
connection.execute(
"INSERT INTO files (filename, content) VALUES (?, ?)",
("image.png", image_data)
)
مقادیر بهصورت پارامتری ارسال میشوند. این روش از قراردادن مستقیم دادهها در متن SQL جلوگیری میکند و برای دادههای باینری نیز مناسب است.
⚠️ نکات مهم
BLOB برای دادههای باینری است؛ TEXT برای متن.
فایلهای بزرگ میتوانند حجم Database و هزینه خواندن و نوشتن را افزایش دهند.
در پروژههای بزرگ، ممکن است نگهداری فایلها در فضای ذخیرهسازی جداگانه و ذخیره مسیر یا شناسه آنها در Database مناسبتر باشد.
نام فایل را بهتنهایی معیار مطمئنی برای شناسایی یک رکورد در نظر نگیر؛ در پروژه واقعی بهتر است از id یا یک شناسه یکتا استفاده کنی.
🧠 خلاصه
Path.read_bytes()
↓
bytes
↓
SQLite BLOB
↓
bytes
↓
Path.write_bytes()
🎯 تمرین
برنامهای بنویس که فایل document.pdf را بخواند، محتوای آن را در جدول documents با ستونهای id، filename و content ذخیره کند و سپس با استفاده از id، فایل را بازیابی کند.
پست ۲۲۲ از دوره جامع Python 🐍
1 ·