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

news/2025/1/10 16:46:22/

        在 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 sqlite>sqlite3 # 连接数据库 
    conn = sqlite>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.ppmy.cn/news/1562020.html

相关文章

HTML+CSS+JS制作中国传统节日主题网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个中国传统节日主题网站,包含首页、节日介绍页、民俗文化页、节日活动页、联系我们页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部横幅区 包含传统中国风格的网站标题中国传统…

解决Vscode中使用netdb.h的getaddrinfo和addrinfo会报错的方法

原文地址:https://kashima19960.github.io/2024/12/03/解决Vscode中使用netdb.h的getaddrinfo和addrinfo会报错的方法/,一般有最新的修改都是在我的个人博客里面,所以在当前平台的更新会比较慢,请见谅😃 前言 博主最近…

JAVA 使用apache poi实现EXCEL文件的输出;apache poi实现标题行的第一个字符为红色;EXCEL设置某几个字符为别的颜色

设置输出文件的列宽,防止文件过于丑陋 Sheet sheet workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME); sheet.setColumnWidth(0, 40 * 256); sheet.setColumnWidth(1, 20 * 256); sheet.setColumnWidth(2, 20 * 256); sheet.setColumnWidth(3, 20 * 25…

【合作原创】使用Termux搭建可以使用的生产力环境(九)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境(八)-CSDN博客中我们讲到了如何安装IDEA社区版,并在Termux中安装VNC服务器,在proot-distro的Debian中启动xfce桌面,并通过这个方式解决了IDEA社区版中无…

『SQLite』子查询可以这样用

摘要:本节主要讲子查询的使用,可以在查询、更新、修改、删除等操作中使用。 什么是子查询? 子查询是一种在 SELECT-SQL 语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询(Sub Query&#…

中文博客排版指南

标题 正确:(Markdown 语法) # 文章的标题## 文章内容的一级标题### 文章内容的二级标题#### 文章内容的三级标题原则: (1)文章内容的标题一般用 ## 和 ###。为保证层级的简单,请尽量避免出现…

el-table 使用el-form 表单验证

1. form定义时,需要定义tableData const supplyForm ref({ tableData: [] })const supplyFormRules reactive({bomNumber: [{ required: true, message: 请填写物料编号, trigger: blur }],bomName: [{ required: true, message: 请填写名称, trigger: blur }] }…

Solidity合约编写(三)

解决问题: 在 Solidity 合约中使用 Chainlink 获取 ETH/USD 的价格(汇率),需要使用 Chainlink 的 AggregatorV3Interface 接口。以下是一个样板代码,展示了如何在测试链(如 Goerli 或 Sepolia)…