当前位置: 首页 > news >正文

文件读写到SQLite数据库的方法

        在 SQLite 数据库中,将文件读写到数据库的常见方法主要有以下几种:


1. 将文件以 BLOB 类型存储

        BLOB(Binary Large Object) 是 SQLite 中的二进制数据类型,可以直接用来存储文件内容。

步骤:
  1. 创建表
    创建一个包含 BLOB 类型字段的表,例如:

    CREATE TABLE Files ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, data BLOB NOT NULL ); 
  2. 读取文件内容
    使用编程语言(如 Python、C# 等)将文件内容读取为二进制数据。

  3. 插入文件内容
    使用 INSERT 语句插入文件内容。例如,使用 Python:

    import sqlite3 # 连接数据库 
    conn = sqlite3.connect('example.db') 
    cursor = conn.cursor() # 插入文件 
    with open('example.pdf', 'rb') as file: 
    file_data = file.read() 
    cursor.execute("INSERT INTO Files (name, data) VALUES (?, ?)", ('example.pdf', file_data)) 
    conn.commit() 
    conn.close() 
  4. 读取文件内容
    从数据库中读取文件,并保存到本地:

    cursor.execute("SELECT name, data FROM Files WHERE id = ?", (1,)) 
    file_name, file_data = cursor.fetchone() 
    with open(file_name, 'wb') as file: 
    file.write(file_data) 

2. 存储文件路径

        这种方法不是直接保存文件,而是将文件存储在文件系统中,并将文件路径保存到数据库。

优点:
  • 数据库不会变得很大。
  • 文件可以独立于数据库管理。
缺点:
  • 需要额外管理文件和数据库的一致性。
  • 如果文件被删除或移动,路径可能失效。
步骤:
  1. 创建表
    创建一个存储文件路径的表,例如:

    CREATE TABLE FilePaths ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, path TEXT NOT NULL ); 
  2. 插入文件路径
    将文件路径插入表中:

    INSERT INTO FilePaths (name, path) VALUES ('example.pdf', '/path/to/example.pdf'); 
  3. 读取文件路径
    从数据库中获取文件路径:

    SELECT path FROM FilePaths WHERE id = 1; 
  4. 访问文件
    使用文件路径从文件系统中访问文件。


3. 文件分块存储

        如果文件过大,可以将文件切分成块,并逐块存储到数据库。

步骤:
  1. 创建表
    创建一个存储文件块的表,例如:

    CREATE TABLE FileChunks ( id INTEGER PRIMARY KEY AUTOINCREMENT, file_id INTEGER NOT NULL, chunk_index INTEGER NOT NULL, chunk_data BLOB NOT NULL ); 
  2. 分块存储文件
    读取文件内容并逐块存储:

    chunk_size = 1024 * 1024 # 每块大小 (1MB) 
    with open('example.pdf', 'rb') as file: 
    chunk_index = 0 
    while chunk := file.read(chunk_size): cursor.execute("INSERT INTO FileChunks (file_id, chunk_index, chunk_data) VALUES (?, ?, ?)", (1, chunk_index, chunk)) chunk_index += 1 
  3. 重新组装文件
    从数据库中按顺序读取所有块,并重新组装:

    cursor.execute("SELECT chunk_data FROM FileChunks WHERE file_id = ? ORDER BY chunk_index", (1,)) 
    with open('output.pdf', 'wb') as file: 
    for row in cursor.fetchall(): 
    file.write(row[0]) 

总结

方法优点缺点
BLOB 存储简单易用,数据和文件集中管理数据库可能变得很大,查询性能可能下降
存储路径数据库大小不会受文件影响需要管理文件和数据库的一致性
分块存储可处理大文件实现复杂,性能稍差

根据需求选择合适的方法。如果文件较小且需要集中管理,建议使用 BLOB 存储;如果文件较大或频繁访问,建议使用 存储路径

http://www.lryc.cn/news/518253.html

相关文章:

  • springboot项目部署至linux
  • 使用sed命令封装自定义dos2unix脚本
  • 调整Python+Pytest+Allure+Yaml+Pymysql框架中需要执行的用例顺序
  • 带内管理和带外管理
  • 【操作系统】阻塞非阻塞I/O、同步异步I/O
  • spring cloud alibaba-dubbo3 rpc运行原理
  • 【Uniapp-Vue3】computed计算属性用法及方法对比
  • web实操10——Filter和Listener
  • Spring中,出现依赖不完全注入后才执行逻辑
  • 如何选择 Dockerfile 的放置方式
  • 用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效
  • cat命令详解
  • el-table 自定义表头颜色
  • window.print()预览时表格显示不全
  • React Router底层核心原理详解
  • linux MySQL 实时性能监控工具
  • ModuleNotFoundError: No module named ‘setuptools_rust‘ 解决方案
  • 基于Spring Boot的海滨体育馆管理系统的设计与实现
  • 【机器视觉】OpenCV 图像轮廓(查找/绘制轮廓、轮廓面积/周长、多边形逼近与凸包、外接矩形)
  • 深入浅出:React 前端框架解析与应用
  • 【网络安全设备系列】7、流量监控设备
  • qemu解析qcow文件
  • 免费网站源码下载指南:如何安全获取并降低开发成本
  • 【Ubuntu】如何设置 Ubuntu 自动每日更新:轻松保持系统安全
  • 江科大STM32入门——UART通信笔记总结
  • github gitbook写书
  • 探秘MetaGPT:革新软件开发的多智能体框架(22/30)
  • 【优选算法】Binary-Blade:二分查找的算法刃(下)
  • Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
  • 分治算法——优选算法