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

边走边聊 Python 3.8:Chapter 12+1:MyKB 升级篇-用 SQLite 数据库彻底替换 JSON 存储

MyKB 升级篇:用 SQLite 数据库彻底替换 JSON 存储MyKB笔记多了以后,JSON 文件读写越来越慢,搜索也卡。今天我们直接升级,把notes.json彻底换成SQLite 数据库!为什么换 SQLite?Python 3.8内置sqlite3模块(Win7 无需 pip 安装)查询速度提升 10 倍以上(支持索引)支持 SQL 语句,以后想加“按标签统计”“按日期范围”超级简单数据更安全(事务机制,意外断电也不会损坏)文件体积更小,自动归档更优雅全部改动只集中在note_manager.py,其他文件几乎不用动!1、项目结构小调整(只需加一个文件)MyKB/ ├── main.py ├── config.py ├── note_manager.py ← 重点替换这个 ├── gui.py ├── utils.py ├── notes/ │ ├── mykb.db ← 新增的 SQLite 数据库文件(程序自动创建) │ └── archive/ ← 归档文件夹保持不变 ├── data/ ├── ...2、完整替换后的 note_manager.py(直接覆盖)# -*- coding: utf-8 -*-importsqlite3importosfromdatetimeimportdatetime,timedeltaimportjson# 只用于迁移旧数据fromconfigimportNOTES_DIR,ARCHIVE_DIRclassNoteManager:def__init__(self):self.db_path=os.path.join(NOTES_DIR,"mykb.db")self.conn=sqlite3.connect(self.db_path)self.conn.row_factory=sqlite3.Row# 让查询结果可以像字典一样访问self.create_table()self.migrate_from_json()# 首次运行时自动迁移旧 JSON 数据defcreate_table(self):"""创建笔记表 + 索引"""cursor=self.conn.cursor()cursor.execute(''' CREATE TABLE IF NOT EXISTS notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL, tags TEXT, -- 用逗号分隔存储 date TEXT NOT NULL ) ''')# 为搜索创建索引(速度飞起!)cursor.execute('CREATE INDEX IF NOT EXISTS idx_title ON notes(title)')cursor.execute('CREATE INDEX IF NOT EXISTS idx_content ON notes(content)')cursor.execute('CREATE INDEX IF NOT EXISTS idx_date ON notes(date)')self.conn.commit()defmigrate_from_json(self):"""只运行一次:把旧 notes.json 迁移到 SQLite"""json_path=os.path.join(NOTES_DIR,"notes.json")ifos.path.exists(json_path)andnotself.get_all_notes():print("正在迁移旧 JSON 数据到 SQLite...")withopen(json_path,"r",encoding="utf-8")asf:old_notes=json.load(f)fornoteinold_notes:tags_str=",".join(note.get("tags",[]))self.add_note(note["title"],note["content"],tags_str,note["date"])# 迁移完备份旧文件os.rename(json_path,json_path+".bak")print(f"迁移完成!共{len(old_notes)}条笔记,已备份为 notes.json.bak")defadd_note(self,title,content,tags="",date=None):"""新增笔记"""ifdateisNone:date=datetime.now().strftime("%Y-%m-%d %H:%M:%S")cursor=self.conn.cursor()cursor.execute(''' INSERT INTO notes (title, content, tags, date) VALUES (?, ?, ?, ?) ''',(title,content,tags,date))self.conn.commit()returncursor.lastrowiddefget_all_notes(self):"""获取所有笔记(用于界面列表)"""cursor=self.conn.cursor()cursor.execute("SELECT id, title, date FROM notes ORDER BY date DESC")return[dict(row)forrowincursor.fetchall()]defsearch(self,keyword):"""全文搜索(标题 + 内容 + 标签)"""keyword=f"%{keyword}%"cursor=self.conn.cursor()cursor.execute(''' SELECT id, title, date FROM notes WHERE title LIKE ? OR content LIKE ? OR tags LIKE ? ORDER BY date DESC ''',(keyword,keyword,keyword))return[dict(row)forrowincursor.fetchall()]defget_note_by_id(self,note_id):"""查看单条笔记详情"""cursor=self.conn.cursor()cursor.execute("SELECT * FROM notes WHERE id = ?",(note_id,))row=cursor.fetchone()returndict(row)ifrowelseNonedefauto_archive(self):"""自动归档 30天的笔记(保持原有逻辑)"""threshold=(datetime.now()-timedelta(days=30)).strftime("%Y-%m-%d %H:%M:%S")cursor=self.conn.cursor()cursor.execute("SELECT * FROM notes WHERE date ?",(threshold,))old_notes=[dict(row)forrowincursor.fetchall()]ifold_notes:fornoteinold_notes:archive_path=os.path.join(ARCHIVE_DIR,f"{note['id']}_{note['title'][:20]}.json")withopen(archive_path,"w",encoding="utf-8")asf:json.dump(note,f,ensure_ascii=False,indent=2)cursor.execute("DELETE FROM notes WHERE id = ?",(note["id"],))self.conn.commit()print(f"已归档{len(old_notes)}条笔记")defclose(self):"""程序退出时关闭连接"""self.conn.close()3、其他文件只需微调(复制粘贴即可)1. gui.py 中的小改动(替换对应函数)# 在 KBApp 类里替换以下两个方法:defrefresh_list(self):foriinself.tree.get_children():self.tree.delete(i)notes=self.manager.get_all_notes()fornoteinnotes:self.tree.insert("","end",values=(note["id"],note["title"],note["date"]))defdo_search(self):kw=self.search_entry.get().strip()ifnotkw:self.refresh_list()returnresults=self.manager.search(kw)foriinself.tree.get_children():self.tree.delete(i)fornoteinresults:self.tree.insert("","end",values=(note["id"],note["title"],note["date"]))defview_note(self):sel=self.tree.selection()

相关文章:

边走边聊 Python 3.8:Chapter 12+1:MyKB 升级篇-用 SQLite 数据库彻底替换 JSON 存储

MyKB 升级篇:用 SQLite 数据库彻底替换 JSON 存储 MyKB笔记多了以后,JSON 文件读写越来越慢,搜索也卡。 今天我们直接升级,把 notes.json 彻底换成 SQLite 数据库! 为什么换 SQLite? Python 3.8 内置 sqlite3 模块(Win7 无需 pip 安装) 查询速度提升 10 倍以上(支持…...

工业语言:02 HMI长什么样?电阻式、电容式、多点触控、OLED 显示拆解

02 HMI长什么样?电阻式、电容式、多点触控、OLED 显示拆解 拆开 HMI,我才知道工厂的屏幕比手机还讲究 工厂的屏幕不是用来“好看”的,而是用来“看得清、按得准、用得久”。 哎呀兄弟们,把茶杯先搁一边儿,今天咱们把一台HMI抬到车间工作台上,戴上手套,螺丝刀一撬——拆…...

Stream-rec直播录制神器:5分钟搭建你的专属录播系统

Stream-rec直播录制神器:5分钟搭建你的专属录播系统 【免费下载链接】stream-rec Automatic streaming record tool. Live stream and bullet comments recorder. 虎牙/抖音/斗鱼/Twitch/PandaTV/微博直播,弹幕自动录制 项目地址: https://gitcode.com…...

10分钟轻松搞定网易云音乐NCM文件转换:小白也能上手的终极指南

10分钟轻松搞定网易云音乐NCM文件转换:小白也能上手的终极指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐下载了喜欢的…...

给老项目续命:手把手解决Visual Studio .Net 2003安装中的‘重启死循环’和IIS扩展缺失

给老项目续命:手把手解决Visual Studio .Net 2003安装中的‘重启死循环’和IIS扩展缺失 维护遗留系统就像考古发掘,每次打开那些尘封的代码库,总能在Windows XP虚拟机里发现新的"惊喜"。上周刚帮客户解决了一个财务系统的千年虫问题…...

DS4Windows终极指南:免费解决PS手柄在Windows上的兼容性难题

DS4Windows终极指南:免费解决PS手柄在Windows上的兼容性难题 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 还在为PlayStation手柄无法在Windows电脑上正常使用而烦恼吗&…...

VSCode高亮插件highlight-words的隐藏玩法:不止F8,打造你的多色标记系统(附settings.json配置详解)

VSCode高亮插件highlight-words的隐藏玩法:不止F8,打造你的多色标记系统(附settings.json配置详解) 在代码阅读和调试过程中,快速定位关键信息是提升效率的核心。VSCode的highlight-words插件常被简化为"按F8高亮…...

【第3篇】Chatbox:它有几个 Cherry Studio 没有的独门绝技

系列导航:前两篇讲了 API 基础和 Cherry Studio,这篇说 Chatbox——它在程序员圈子里口碑极好,原因是它有几个 Cherry Studio 没有的独门绝技。一、Chatbox 是什么?如果把 Cherry Studio 比作 微信(界面友好&#xff0…...

3步轻松搞定Fedora启动盘:Media Writer全平台指南

3步轻松搞定Fedora启动盘:Media Writer全平台指南 【免费下载链接】MediaWriter Fedora Media Writer - Write Fedora Images to Portable Media 项目地址: https://gitcode.com/gh_mirrors/me/MediaWriter Fedora Media Writer是一款专为Fedora系统设计的启…...

Xshell公钥登录背后的原理与安全实践:除了免密,你更该知道这些

Xshell公钥登录背后的原理与安全实践:除了免密,你更该知道这些 每次在终端输入ssh userhost后流畅登录服务器的体验,背后其实隐藏着一场精密的加密对话。公钥认证不仅仅是省去输入密码的便利,更是一套基于非对称加密的安全体系。本…...

每日热门skill:automation-workflows 深度研究报告

一、痛点引入:你的时间正在被"重复"偷走 早上9点,你打开电脑。 第一件事:复制昨天客户表单里的10条数据,手动粘贴到 CRM。 第二件事:给这10个客户发欢迎邮件——每封邮件改个名字、改个公司名。 第三件事:在表格里标注"已跟进",顺便更新一下你的进…...

如何用Ryujinx在电脑上畅玩Switch游戏:从零开始的终极指南

如何用Ryujinx在电脑上畅玩Switch游戏:从零开始的终极指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上体验《塞尔达传说:旷野之息》或《超级马里…...

FinRobot开源框架:构建金融AI统一基础架构的实践指南

1. 项目概述:当金融遇上AI,一个开源框架的诞生 如果你在金融科技领域摸爬滚打过几年,一定会对“数据孤岛”和“模型黑箱”这两个词深恶痛绝。分析师们守着彭博终端、Wind、Tushare等一堆数据源,数据清洗和特征工程就能耗掉80%的时…...

【无人机三维路径规划】基于人工蜂群算法实现无人机三维路径规划含Matlab代码

⛄ 内容介绍随着无人机可执行任务的多样化,航迹规划成为其顺利完成任务的基本前提。针对该问题,提出了基于人工蜂群算法的无人机航迹规划方法。运用等效地形模拟方法,将作战区域中的敌方威胁、地形障碍等效为山峰,构建了无人机航迹…...

进程空洞化与无进程C2:Outis框架的隐蔽渗透测试实战解析

1. 项目概述:一个被低估的渗透测试利器如果你在渗透测试或者红队评估领域摸爬滚打了一段时间,肯定对“命令与控制”(C2)框架不陌生。从大名鼎鼎的Cobalt Strike、Metasploit,到后起之秀Sliver、Havoc,这些工…...

从变频器维修师傅的视角,聊聊PWM死区那些“坑”与实战经验

变频器维修实录:PWM死区设置不当引发的血案与生存指南 1. 当示波器成为"凶案现场":三起真实炸机案例分析 那是个闷热的周五下午,某化工厂的160kW变频器在启动瞬间爆出刺眼的火花,伴随着IGBT模块炸裂的闷响&#xff0c…...

电气设计效率翻倍!深度解析EPlan中‘面向对象’与‘面向图形’两大核心模式,你的图纸规范吗?

电气设计效率翻倍!深度解析EPlan中‘面向对象’与‘面向图形’两大核心模式 在电气设计领域,图纸不仅是工程语言的载体,更是项目全生命周期的数据枢纽。传统CAD工具往往让工程师陷入"图形绘制"的泥潭,而EPlan通过面向对…...

终极指南:如何用Stream-Translator实时转录翻译直播流音频

终极指南:如何用Stream-Translator实时转录翻译直播流音频 【免费下载链接】stream-translator 项目地址: https://gitcode.com/gh_mirrors/st/stream-translator Stream-Translator是一个强大的开源工具,专门用于实时转录或翻译直播流中的音频内…...

从散热片到小水泵:一文看懂CPU水冷散热器的内部构造与工作原理

从散热片到小水泵:一文看懂CPU水冷散热器的内部构造与工作原理 当你第一次拆开水冷散热器时,可能会被里面精密的构造所震撼——这哪里是简单的散热设备,分明是一个微缩版的工业级冷却系统。作为现代高性能电脑的核心散热方案,水冷…...

为什么BiliDownload是B站视频下载的最佳解决方案?

为什么BiliDownload是B站视频下载的最佳解决方案? 【免费下载链接】BiliDownload B站视频下载工具 项目地址: https://gitcode.com/gh_mirrors/bil/BiliDownload 在当今数字内容爆炸的时代,B站(哔哩哔哩)已成为无数人获取知…...

嵌入式开发方法

嵌入式开发方法:构建智能世界的技术基石 在当今智能化浪潮中,嵌入式系统作为连接物理世界与数字世界的桥梁,已广泛应用于智能家居、工业控制、医疗设备等领域。嵌入式开发方法的核心在于通过软硬件协同设计,实现资源受限环境下的…...

避坑指南:D435i在Win10/Ubuntu 20.04下的驱动安装与Python环境配置全流程

D435i深度相机开发环境搭建实战:Windows与Ubuntu双系统避坑手册 第一次接触Intel RealSense D435i深度相机的开发者,往往会在驱动安装和Python环境配置环节遇到各种"坑"。本文将基于Windows 10和Ubuntu 20.04 LTS两个主流操作系统&#xff0c…...

HotGo插件化架构:如何让团队开发效率提升300%的实战指南

HotGo插件化架构:如何让团队开发效率提升300%的实战指南 【免费下载链接】hotgo HotGo 是一个基于 vue 和 goframe2.0 开发的全栈前后端分离的开发基础平台和移动应用平台,集成jwt鉴权,动态路由,动态菜单,casbin鉴权&a…...

EldenRingSaveCopier:3分钟学会安全迁移艾尔登法环存档的终极方案

EldenRingSaveCopier:3分钟学会安全迁移艾尔登法环存档的终极方案 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为《艾尔登法环》存档丢失而焦虑吗?每次重装系统或更换电脑&…...

inotifywait:Linux 下的实时文件系统事件监控工具详解

在 Linux 系统管理和开发中,实时监控文件系统事件(如文件创建、修改、删除等)是一项常见需求。例如:自动备份配置文件、监控日志更新、触发构建流程等。inotifywait 工具正是为此而生——它基于 Linux 内核的 inotify 子系统&…...

如何让老旧电视焕发新生?这款原生Android直播软件或许是答案

如何让老旧电视焕发新生?这款原生Android直播软件或许是答案 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否也曾面临这样的困境:家中那台陪伴多年的智能电视…...

从飞机机翼到羽毛球拍:图解复合材料‘可设计性’在5个产品中的实战

从飞机机翼到羽毛球拍:5个产品中的复合材料可设计性实战解析 复合材料正在重塑现代工业产品的性能边界。想象一下,一架商用客机的机翼在万米高空承受着极端温差和气流冲击,而职业选手手中的羽毛球拍每秒承受着超过300公里时速的冲击——这些看…...

从深度强化学习环境搭建出发:为什么我选择在Ubuntu 20.04上用Unity Hub 2021.2.12

深度强化学习环境搭建:Ubuntu 20.04与Unity Hub 2021.2.12的技术选型实践 在深度强化学习(DRL)的研究与开发中,仿真环境的构建往往成为项目落地的关键瓶颈。不同于传统机器学习任务,DRL算法需要在动态交互中不断试错&a…...

拯救者R9000P到手后必做的10件事:从验机到优化,保姆级避坑指南(含BIOS设置)

拯救者R9000P新机完全优化手册:从验机到性能调校的20个关键步骤 刚拿到拯救者R9000P的兴奋感还没消退,面对这台性能猛兽,你是否也在思考如何让它发挥最大潜力?作为一款搭载AMD R9-7945HX处理器和RTX4060显卡的高性能笔记本&#x…...

大麦助手DamaiHelper终极指南:三分钟搞定演唱会抢票的完整教程

大麦助手DamaiHelper终极指南:三分钟搞定演唱会抢票的完整教程 【免费下载链接】damaihelper 支持大麦网,淘票票、缤玩岛等多个平台,演唱会演出抢票脚本 项目地址: https://gitcode.com/gh_mirrors/dam/damaihelper 🎉 大麦…...