Python中使用sqlite3模块和panel完成SQLite数据库中PDF的写入和读取

常规笔记软件在管理非文本文件时存在较大局限。尽管Notion等工具能便捷管理PDF等文件,但在批量处理方面仍有不足。

采用数据库系统管理笔记内容具有一定优势,但MySQL和PostgreSQL等数据库需要复杂的安装配置流程,显得过于笨重。相比之下,SQLite作为轻量级数据库引擎,具有自包含、无服务器、零配置和事务支持等特性。作为全球应用最广泛的SQL引擎之一,SQLite不受版权限制,可轻松实现本地数据库创建。配合云盘同步,还能实现跨设备操作,是个人文件管理的理想选择。

SQLite

SQL语法的内容参考下面内容

SQLite教程(菜鸟教程)

DataSpell

建议使用JetBrains的DataSpell软件进行数据库操作,该软件不仅支持数据库连接,还提供了便捷的Jupyter Notebook和Python脚本编写功能。此外,PyCharm也是不错的选择,同样具备数据库连接能力。

panel

panel 是一个用于构建交互式 Web 应用和仪表板的 Python 库,由 HoloViz 项目开发。它基于 Bokeh 构建,可以轻松地将数据、图表、小部件(widgets)等组合成美观且响应式的 Web 界面,适用于 Jupyter Notebook、独立服务器或嵌入到其他 Web 应用中。使用panel可以很方便的创建Python的网页端应用,快速实现可视化。

https://panel.holoviz.org/

代码实现

设置路径,创建或连接数据库:

python 复制代码
folder_path = r"your_folder_path"# 你想读取或者创建(读取不存在的数据库时会自动创建)的数据库的文件夹
import sqlite3,os #使用os模块方便路径的操作
conn = sqlite3.connect(os.path.join(folder_path, "your_database.db")) #your_database可以使用自己想要的名称
cur = conn.cursor()

在数据库中创建表格:

python 复制代码
cur.execute("""
CREATE TABLE IF NOT EXISTS Writings (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
illustration TEXT NOT NULL,
writing BLOB NOT NULL
)
""")

记得需要提交,才能在数据中看到表格:

python 复制代码
conn.commit()

在DataSpell或者PyCharm中可以参考下面指引查看数据库:

选择你的SQLite数据库:

点开表,你就可以看到新建的表了!

制定你需要写入的PDF的文件路径以及文件:

python 复制代码
downloads = "your_pdf_file_folder"
pdf_file_path = os.path.join(downloads, "your_pdf_file_name.pdf")
python 复制代码
with open(pdf_file_path, "rb") as f:
    data = f.read()
python 复制代码
illustration = """
# 这时一个说明
时间:2025年11月8日

你可以这样使用markdown的语法书写,并在后面调取相关内容的时候使用markdown渲染,就可以实现类似笔记的效果。
"""

写入说明以及PDF的二进制数据:

python 复制代码
cur.execute("""
INSERT INTO Writings (illustration, writing) VALUES (?, ?)
""",(illustration,data))
python 复制代码
conn.commit()
cur.close()
conn.close()

接下来介绍数据的读取。想要将PDF读取出来保存在指定文件夹,可以利用如下代码实现:

python 复制代码
cur.execute("""
SELECT writing FROM Writings WHERE id = 1
""")
pdf = cur.fetchone()
python 复制代码
with open(os.path.join(folder_path, "you_subfolder", "your_pdf_name.pdf"), "wb") as f:
    f.write(pdf[0])

可以去对应文件夹检查文件是否存在,或者用os模块查看:

python 复制代码
os.listdir(os.path.join(folder_path, "your_subfolder"))

接下来使用panel实现数据库存储的PDF的网页查看:

python 复制代码
import panel as pn
import base64

pn.extension(sizing_mode="stretch_width")

# 获取 PDF 二进制
pdf_bytes = pdf[0] #这里和上面写入文件的是一致的,都是使用从数据库中得到的二进制数据。

# 转为 Base64
b64_pdf = base64.b64encode(pdf_bytes).decode("utf-8")
pdf_data_url = f"data:application/pdf;base64,{b64_pdf}"

# 构造 HTML 内容(使用 iframe 嵌入)
html_content = f"""
<iframe src="{pdf_data_url}"
        width="100%"
        height="800px"
        style="border: none;">
</iframe>
"""

# 使用 Panel 显示
pdf_pane = pn.pane.HTML(html_content, sizing_mode="stretch_both")

# 构建应用
app = pn.Column(
    pn.pane.Markdown("## 数据库中的 PDF 预览"),
    pdf_pane,
    sizing_mode="stretch_both"
)

# 启动
if __name__ == "__main__":
    app.show()  # 或 pn.serve(app, port=5006)

效果:

相关推荐
keep one's resolveY17 分钟前
时区问题解决
数据库
Leinwin28 分钟前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
qq_4176950534 分钟前
机器学习与人工智能
jvm·数据库·python
漫随流水36 分钟前
旅游推荐系统(view.py)
前端·数据库·python·旅游
ego.iblacat1 小时前
MySQL 服务基础
数据库·mysql
yy我不解释1 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
Maverick062 小时前
Oracle Redo 日志操作手册
数据库·oracle
紫丁香3 小时前
AutoGen详解一
后端·python·flask
左左右右左右摇晃3 小时前
计算机网络笔记整理
笔记·计算机网络
不吃西红柿的853 小时前
[职场] 内容运营求职简历范文 #笔记#职场发展
笔记·职场和发展·内容运营