使用DuckDB查询DeepSeek历史对话

DeepSeek网页版在左下角个人信息/系统设置的账号管理页签中有个“导出所有历史对话”功能,点击“导出”,片刻就能生成一个deepseek_data-2025-06-14.zip的文件,里面有2个json文件,直接用文本编辑器查看不太方便。
而用DuckDB查询却很方便。

一开始,我们不知道这个json包括哪些字段,输入:

D select * from 'conv.json' limit 1;
┌──────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│          id          │        title         │     inserted_at      │      updated_at      │                                                      mapping                                                      │
│         uuid         │       varcharvarcharvarchar        │ struct(root struct(id varchar, parent json, children varchar[], message json), "1" struct(id varchar, parent va…  │
├──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ e6535268-e25a-4620…  │ 麻将胡牌判断函数实现 │ 2025-01-23T14:10:3…  │ 2025-01-23T14:48:2…  │ {'root': {'id': root, 'parent': NULL, 'children': [1], 'message': NULL}, '1': {'id': 1, 'parent': root, 'childr…  │
└──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

可见,这个文件有5个字段,对话信息保存在mapping中,其他都是它的属性信息,标题,建立和更新时间,还有uuid。
为了看起来方便,我们设置输出模式为list, 这样就能显示mapping的全部内容,而不会被截断,我们看到mapping中的各个字段,有我们的问话和deepseek的回答。

D .mode list
D select mapping from 'conv.json' limit 1;
mapping
{'root': {'id': root, 'parent': NULL, 'children': [1], 'message': NULL}, '1': {'id': 1, 'parent': root, 'children': 
[2], 'message': {'files': [], 'search_results': NULL, 'model': deepseek-chat, 'reasoning_content': NULL, 
'content': 请给出一个函数,输入是长度为14的unicode的麻将字符串,返回是否胡牌的布尔值, 'inserted_at': '2025-01-23T14:10:32.372143+00:00'}}, '2': {'id': 2, 'parent': 1, 'children': [4], 
'message': {'files': [], 'search_results': NULL, 'model': deepseek-chat, 'reasoning_content': NULL, 
'content': '要判断一个长度为14的Unicode字符串是否表示一副胡牌的麻将牌型,我们需要遵循麻将的基本规则。通常,胡牌的牌型由4个顺子或刻子(每组3张牌)加上一对将牌组成。以下是Python代码实现:

`` `python
def is_winning_hand(hand):
    from collections import defaultdict

    if len(hand) != 14:
        return False

一般情况下,这样输出已经足够了,对话中的换行也从json文件中的转义符\n转换成了实际换行,很便于阅读。
而如果历史记录很多,也可以根据标题和时间进行筛选,这时,我把它切回box模式

D .mode box
D select title, inserted_at from 'conv.json' where inserted_at::date between date'2025-06-01' and  date'2025-06-15' and title like'%DuckDB%';
┌──────────────────────────────────────────────────┬──────────────────────────────────┐
│                      title                       │           inserted_at            │
├──────────────────────────────────────────────────┼──────────────────────────────────┤
│ DuckDB PostgreSQL查询功能实现分析                │ 2025-06-01T06:12:58.998000+08:00 │
│ DuckDB实现XLS读取功能                            │ 2025-06-08T12:23:09.081000+08:00 │
│ DuckDB查询结果导出XLS实现                        │ 2025-06-08T22:36:21.605000+08:00 │
│ DuckDB CSV Copy Function Implementation Analysis │ 2025-06-09T13:14:15.707396+00:00 │
│ DuckDB技术文档翻译与总结                         │ 2025-06-13T17:55:30.205000+08:00 │
└──────────────────────────────────────────────────┴──────────────────────────────────┘
<think>好的,我需要介绍如何在C++中使用DuckDB。首先,用户可能想知道DuckDB是什么,所以我要先简要说明它是一个嵌入式分析型数据库管理系统,适用于OLAP场景。接着,需要指导用户如何开始使用,比如安装和配置步骤。可能用户不熟悉如何获取DuckDB的C++库,所以得说明下载或编译的方法。 然后,需要给出一个简单的代码示例,展示如何连接数据库、创建表、插入数据和查询数据。这里要注意代码的正确性,比如包含正确的头文件,链接库文件,以及使用正确的命名空间。同时,要确保代码中的SQL语句正确,比如使用占位符和参数绑定来防止SQL注入。 接下来,用户可能对事务管理和错误处理感兴趣,所以需要解释DuckDB的事务支持,比如自动提交和显式事务,以及如何捕获异常。这部分需要强调异常处理的重要性,避免程序崩溃。 此外,性能优化也是关键点。需要提到DuckDB的列式存储、向量化查询执行和并行处理能力,以及如何通过预编译语句和批量数据插入来提高效率。这些内容帮助用户充分利用DuckDB的优势。 最后,总结DuckDB在C++中的适用场景,比如数据分析、机器学习预处理等,并指出其轻量级和无需独立服务器的优点。确保整个回答结构清晰,步骤明确,覆盖用户可能遇到的主要问题,同时保持语言简洁易懂。</think>C++ 中使用 DuckDB 的逐步指南: DuckDB 是一款轻量级嵌入式分析型数据库管理系统,专为 OLAP 场景设计。以下是在 C++ 项目中使用它的完整流程: 1. **环境准备** ```bash # 下载预编译库(Linux示例) wget https://github.com/duckdb/duckdb/releases/download/v1.0.0/duckdb_cli-linux-amd64.zip unzip duckdb_cli-linux-amd64.zip ``` 2. **基本使用示例** ```cpp #include "duckdb.hpp" using namespace duckdb; int main() { // 创建内存数据库 DuckDB db(nullptr); Connection con(db); // 创建表 con.Query("CREATE TABLE users(id INTEGER, name VARCHAR);"); // 插入数据(参数化查询) auto prep = con.Prepare("INSERT INTO users VALUES (?, ?)"); prep->Execute(1, "Alice"); prep->Execute(2, "Bob"); // 查询数据 auto result = con.Query("SELECT * FROM users"); result->Print(); return 0; } ``` 3. **核心功能说明** - **内存存储**:默认使用内存存储,适合快速分析 ```cpp DuckDB db(":memory:"); // 显式指定内存模式 ``` - **持久化存储** ```cpp DuckDB db("mydb.duckdb"); // 保存到文件 ``` 4. **高级特性** - **事务管理** ```cpp con.Query("BEGIN TRANSACTION"); try { con.Query("INSERT INTO users VALUES (3, 'Charlie')"); con.Query("COMMIT"); } catch (std::exception &e) { con.Query("ROLLBACK"); } ``` - **批量数据插入** ```cpp Appender appender(con, "users"); appender.BeginRow(); appender.Append<int32_t>(3); appender.Append<std::string>("Charlie"); appender.EndRow(); appender.Close(); ``` 5. **性能优化技巧** - 启用并行处理 ```cpp con.Query("PRAGMA threads=4"); ``` - 使用列式存储 ```cpp con.Query("CREATE TABLE sensor_data AS SELECT * FROM 'samples.csv'"); ``` **应用场景建议**: - 数据分析中间结果缓存 - 机器学习特征预处理 - 实时日志分析 - 嵌入式设备数据分析 **注意事项**: 1. 编译时需链接 `libduckdb.a` 2. 使用参数化查询防止 SQL 注入 3. 定期调用 `Checkpoint()` 保持数据持久化 4. 建议使用最新稳定版(当前 v1.0.0) 完整文档参考:https://duckdb.org/docs/api/cpp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值