当前位置: 首页 > 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 存储;如果文件较大或频繁访问,建议使用 存储路径

相关文章:

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

在 SQLite 数据库中,将文件读写到数据库的常见方法主要有以下几种: 1. 将文件以 BLOB 类型存储 BLOB(Binary Large Object) 是 SQLite 中的二进制数据类型,可以直接用来存储文件内容。 步骤: 创建表 创建一…...

springboot项目部署至linux

1.修改pom.xml 确认是否有以下代码&#xff0c;没有请进行添加&#xff0c;mainClass改成你的启动类 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…...

使用sed命令封装自定义dos2unix脚本

使用sed命令封装自定义dos2unix脚本 创建 `dos2unix` 脚本使用自定义的 `dos2unix` 脚本注意事项要将 sed -i 封装为一个简单的 dos2unix 脚本,你可以创建一个 Bash 脚本文件,该文件接受文件名作为参数,并使用 sed 命令来删除文件中的 DOS 回车符(\r)。以下是一个基本的实…...

调整Python+Pytest+Allure+Yaml+Pymysql框架中需要执行的用例顺序

当pytest框架中有时时候会因为用例的前后关联关系需要调整用例执行顺序时则可以跟进具体的要求调整pytest.ini配置文件中执行用例文件夹的前后顺序 当如果是需要调整某个文件夹中用例的执行顺序时&#xff0c;则跟进具体的文件调整对应testcases中test_*.py文件中的执行顺序...

带内管理和带外管理

带内管理&#xff08;In-Band Management&#xff09; 概述 带内管理是一种借助生产网络来传输管理数据的网络管理方式&#xff0c;其管理流量与业务流量共享相同的网络路径。 特点 共享网络路径&#xff1a;管理数据和业务数据一同使用现有的网络基础设施&#xff0c;在同…...

【操作系统】阻塞非阻塞I/O、同步异步I/O

阻塞I/O&#xff1a;程序发起I/O操作时&#xff0c;程序被挂起&#xff0c;直到I/O操作完成并返回结果。在这个过程中&#xff0c;程序会被阻塞无法执行其他任务。适用于简单、低并发的场景。 非阻塞I/O&#xff1a;程序发起I/O操作时&#xff0c;不会等待&#xff0c;立即返回…...

spring cloud alibaba-dubbo3 rpc运行原理

Dubbo3 运行原理 Dubbo3 是 Apache Dubbo 的最新版本&#xff0c;是一个高性能、轻量级的分布式服务框架&#xff0c;支持微服务架构。相比 Dubbo2&#xff0c;它在协议、扩展性、服务治理、流控等方面做了大量改进&#xff0c;特别是引入了 Triple 协议&#xff0c;使其更加适…...

【Uniapp-Vue3】computed计算属性用法及方法对比

如果我们想要将两个响应式变量进行某种运算&#xff0c;就可以使用computed计算属性。 比如下面这个例子中&#xff0c;输入名和姓合成全名&#xff0c;可以用直接显示的方法&#xff1a; 我们也可以使用computed属性&#xff1a; import {computed} from "vue"; le…...

web实操10——Filter和Listener

Filter介绍 web三大组件&#xff1a;servlet&#xff0c;filter, lisenter。 Filter快速入门 步骤 拦截路径&#xff1a;你访问什么样的资源&#xff0c;过滤器会生效&#xff0c;包括静态资源&#xff0c;动态资源。 配置&#xff1a;两种配置方式 代码实现 代码&#…...

Spring中,出现依赖不完全注入后才执行逻辑

1. Bean生命周期机制 Spring管理的Bean是通过生命周期回调进行初始化和依赖注入的。以下是典型的生命周期阶段&#xff1a; 实例化&#xff08;Instantiation&#xff09;&#xff1a; 创建Bean对象。依赖注入&#xff08;Dependency Injection&#xff09;&#xff1a; 向Be…...

如何选择 Dockerfile 的放置方式

是否将 Dockerfile 放在项目根目录下还是为每个应用服务单独创建 Dockerfile&#xff0c;取决于项目架构和使用场景。以下是针对不同项目类型的最佳实践和推荐方式&#xff1a; 一、单体应用项目 项目特点 项目是一个单体应用&#xff0c;只有一个运行环境&#xff0c;例如&a…...

用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效

一、引言 跨年夜,五彩斑斓、绚丽绽放的烟花是最令人期待的视觉盛宴之一。在网页端,我们能否通过技术手段复现这一梦幻场景呢?答案是肯定的。本文将深入剖析一段使用 HTML5 Canvas 和 JavaScript 实现的跨年烟花特效源码,带你领略前端技术创造的惊艳画面。 用 HTML5 Canvas…...

cat命令详解

&#x1f3dd;️专栏&#xff1a;https://blog.csdn.net/2301_81831423/category_12872319.html &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” cat 是 Linux/Unix 中的一个非常常用的命令&…...

el-table 自定义表头颜色

第一种方法&#xff1a;计算属性 <template><div><el-table:data"formData.detail"border stripehighlight-current-row:cell-style"{ text-align: center }":header-cell-style"headerCellStyle"><el-table-column fixed…...

window.print()预览时表格显示不全

问题描述&#xff1a;使用element的table组件&#xff0c;表格列宽为自适应&#xff0c;但使用window.print()方法预览的页面会直接按预览宽度截取表格内容进行展示&#xff0c;造成表格可能的显示不全问题 解决方法&#xff1a;添加如下样式 media print {::v-deep {// 表头…...

React Router底层核心原理详解

React Router 是一个功能强大的路由库&#xff0c;它允许开发者在 React 单页面应用&#xff08;SPA&#xff09;中实现客户端路由管理。React Router 通过匹配 URL 和组件的关系来实现页面的导航&#xff0c;它不仅提供了简单的 API&#xff0c;还在底层实现了复杂的 URL 匹配…...

linux MySQL 实时性能监控工具

在 Linux 上&#xff0c;有多个工具可以用于 实时监控 MySQL 的性能。根据你的需求&#xff0c;以下是常用的 MySQL 实时性能监控工具&#xff0c;包括轻量级的命令行工具和可视化监控工具。 &#x1f527; 1. MySQLTuner – 一键性能优化建议 ✅ 特点 快速分析 MySQL 的性能…...

ModuleNotFoundError: No module named ‘setuptools_rust‘ 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 宠物医院…...

【机器视觉】OpenCV 图像轮廓(查找/绘制轮廓、轮廓面积/周长、多边形逼近与凸包、外接矩形)

文章目录 7. 图像轮廓7.1 什么是图像轮廓7.2 查找轮廓7.3 绘制轮廓7.4 轮廓的面积和周长7.5 多边形逼近与凸包7.6 外接矩形 OpenCV官网 7. 图像轮廓 7.1 什么是图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用。 轮廓的作用…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...