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

文件读写到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.kler.cn/a/473424.html

相关文章:

  • 【vue3封装element-plus的反馈组件el-drawer、el-dialog】
  • maven的简单介绍
  • 基于LabVIEW的BeamGage自动化接口应用
  • Docker Compose 启动 Harbor 并指定网络
  • spring boot 多数据源集成mysql、postgresql、phoenix、doris等
  • OpenCV 4.5至4.10版本更新概述
  • C++编程等级认证学习计划day2-1
  • 万界星空科技质量管理QMS系统具体功能介绍
  • AT6668-6N-22:BDS定位SOC芯片,常用在车载系统
  • TensorRT-LLM中的MoE并行推理
  • 【linux系统之redis6】redisTemplate的使用方法
  • 如何轻松反转C# List<T>中的元素顺序
  • “多维像素”多模态雷视融合技术构建自动驾驶超级感知能力|上海昱感微电子创始人蒋宏GADS演讲预告
  • Kafka优势剖析-消费者组、并行消费
  • JavaFX基础之环境配置,架构,FXML
  • GoChina备案管家
  • 深入Android架构(从线程到AIDL)_17 SurfaceView的UI多线程01
  • 数据库中的并发控制
  • 如何将某两个提交去掉父提交的合并
  • YOLOv10改进,YOLOv10改进主干网络为StarNet,CVPR2024,助力模型涨点
  • undolog,redolog,binlog分别是做什么的?
  • VSCODE使用Echarts组件库(不是vue)
  • LeetCode100之组合总和(39)--Java
  • 【已解决】如何让容器内的应用程序使用代理?
  • 怎么分析网页游戏中的数据 官方API 数据挖掘 第三方工具Overwolf、LoLalytics
  • Echarts的认识和基本用法