嵌入式分析利器:DuckDB与SqlSugar实战

news2025/6/7 11:56:00

一、DuckDB 的核心特性与适用场景

DuckDB 是一款 嵌入式分析型数据库(OLAP) ,专为高效查询设计,主要特点包括:

  1. 列式存储与向量化引擎
  • 数据按列存储,提升聚合统计效率(如 SUM/AVG),减少 I/O 开销 。
  • 向量化处理支持批量数据操作,显著加速分析查询 。
  1. 轻量级与嵌入式部署
  • 无需独立服务器,以单文件(如 train_services.db)形式运行,类似 SQLite 。
  • 跨平台支持(Windows/Linux/macOS),压缩后仅约 8MB 。
  1. 兼容性与扩展性
  • 支持标准 SQL 语法 ,兼容 Pandas/R/Python 等工具 。
  • 可直接读取 CSV、JSON、Parquet 等文件,支持远程文件(HTTP/S3)。
  1. 适用场景
  • 实时数据分析、本地数据科学计算、嵌入式应用(如 IoT 设备)。
  • 替代传统 OLAP 的轻量级解决方案,降低部署成本 。

二、SqlSugar 集成 DuckDB 的步骤

  1. 环境准备
    安装 NuGet 包:
Install-Package SqlSugarCore
Install-Package SqlSugar.DuckDBCore
  1. 初始化数据库连接
// 注册 DuckDB DLL(避免运行时缺失)
InstanceFactory.CustomAssemblies = new[] {
    typeof(SqlSugar.DuckDB.DuckDBProvider).Assembly 
};

var db = new SqlSugarClient(new ConnectionConfig() {
    DbType = DbType.DuckDB,                  // 指定数据库类型
    ConnectionString = "DataSource=train_services.db", // 数据库文件路径
    IsAutoCloseConnection = true,            // 自动释放连接
    LanguageType = LanguageType.Default       // 语言类型
}, it => {
    // SQL 日志输出(调试用)
    it.Aop.OnLogExecuting = (sql, para) => {
        Console.WriteLine(UtilMethods.GetNativeSql(sql, para));
    };
});

关键参数解析:

  • ConnectionString:支持内存模式(:memory:)或文件路径 。
  • IsAutoCloseConnection=true:避免手动管理连接生命周期 。
  • DLL 注册必要性:DuckDB 依赖原生库,需显式加载程序集防止运行时错误 。

三、CodeFirst 初始化表结构

通过实体类映射自动创建表:

// 创建数据库(若不存在)
db.DbMaintenance.CreateDatabase(); 

// 根据实体类生成表
db.CodeFirst.InitTables<UserInfo001>(); 

// 差异处理:当实体类与表结构不一致时
db.CodeFirst.InitTables<UserInfo002>(); 

实体类定义规范:

[SugarTable("UserInfo001")] // 指定表名
public class UserInfo001 {
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] // 主键且自增
    public int UserId { get; set; }

    [SugarColumn(Length = 50)] // 字段长度限制
    public string UserName { get; set; }

    public string Email { get; set; }
    public decimal Price { get; set; }
    public DateTime RegistrationDate { get; set; }
}

注意事项:

  • InitTables 自动同步实体属性与表字段 。
  • 字段差异处理:通过 [SugarColumn] 配置数据类型、长度、主键等 。

四、CRUD 操作实现

  1. 插入数据
var id = db.Insertable(new UserInfo001() {
    UserName = "admin",
    Email = "dfafa@qq.com",
    Price = 1.1m,
    Context = "Context",
    RegistrationDate = DateTime.Now
}).ExecuteReturnIdentity(); // 返回自增主键值
  1. 查询数据
// 按主键查询
var userInfo = db.Queryable<UserInfo001>().InSingle(id); 

// 条件查询
var list = db.Queryable<UserInfo001>()
             .Where(u => u.Price > 10)
             .ToList();
  1. 更新数据
userInfo.Email = "updated@qq.com";
db.Updateable(userInfo).ExecuteCommand(); 
  1. 删除数据
db.Deleteable<UserInfo001>()
  .Where(u => u.UserId == id)
  .ExecuteCommand();

性能优化:

  • 批量操作使用 db.Fastest().BulkCopy() 提升海量数据写入效率 。
  • DuckDB 的向量化引擎加速复杂查询 。

五、常见问题解决方案

  1. DLL 加载失败
  • 使用工具(如金山毒霸 DLL 修复)自动修复 。
  • 手动注册:regsvr32 “C:\Path\To\SqlSugar.dll”(管理员权限)。
  1. 表结构同步异常
  • 检查实体类属性与数据库类型的匹配(如 decimal 对应 DECIMAL)。
  • 通过 db.Ado.GetDataTable(“SELECT …”) 验证表结构 。
  1. 连接配置错误
  • 确保 DbType = DbType.DuckDB,文件路径权限正确 。
  • 内存模式路径设为 “:memory:” 。

六、最佳实践建议

  1. 适用场景选择
  • DuckDB 适合 本地分析型任务(如数据清洗、报表生成),高并发事务场景建议用 SQLite/MySQL。
  1. 性能调优
  • 启用 DuckDB 的 列式压缩 减少存储 。
  • 使用 db.Ado.CommandTimeOut=30 设置查询超时 。
  1. 扩展性
  • 通过 MotherDuck 扩展至云端,实现混合查询 。
  • 集成 Apache Arrow 实现零拷贝数据交换 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2400789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux运维笔记:1010实验室电脑资源规范使用指南

文章目录 一. 检查资源使用情况&#xff0c;避免冲突1. 检查在线用户2. 检查 CPU 使用情况3. 检查 GPU 使用情况4. 协作建议 二. 备份重要文件和数据三. 定期清理硬盘空间四. 退出 ThinLinc 时注销&#xff0c;释放内存五. 校外使用时配置 VPN注意事项 总结 实验室的电脑配备了…

【Docker 从入门到实战全攻略(二):核心概念 + 命令详解 + 部署案例】

5. Docker Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 文件来配置应用服务&#xff0c;然后使用一个命令即可创建并启动所有服务。 基本命令 docker-compose up # 创建并启动所有服务 docker-compose down # 停止并移除容器、网络等…

【conda配置深度学习环境】

好的&#xff01;我们从头开始配置一个基于Conda的虚拟环境&#xff0c;覆盖深度学习&#xff08;如PyTorch&#xff09;和传统机器学习&#xff08;如XGBoost&#xff09;&#xff0c;并适配你的显卡&#xff08;假设为NVIDIA&#xff0c;若为AMD请告知&#xff09;。以下是完…

力扣4.寻找两个正序数组的中位数

文章目录 题目介绍题解 题目介绍 题解 题解链接&#xff1a;题解 核心思路&#xff1a;通过二分查找的确定分割点使左右两部分元素数量相等。 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n1 nums1.length;int n2 nums2.length…

【相机基础知识与物体检测】更新中

参考&#xff1a; 黑马机器人 | 相机标定&物体检测https://robot.czxy.com/docs/camera/ 01-相机基础 相机基础概述 相机是机器视觉的基础&#xff0c;相机直接产生了相机数据。所有视觉算法都是作用在相机数据上的。相机数据的好坏&#xff0c;或者对相机数据的理解方式…

【前端】性能优化和分类

本页知识点参考&#xff1a;https://zhuanlan.zhihu.com/p/514222781 1. 加载性能优化 1.1 网站性能优化 content方法&#xff1a; 1&#xff09;减少HTTP请求&#xff1a;合并文件&#xff0c;CSS精灵&#xff0c;inline Image 2&#xff09;减少DNS查询&#xff1a;DNS缓存&…

PPO和GRPO算法

verl 是现在非常火的 rl 框架&#xff0c;而且已经支持了多个 rl 算法&#xff08;ppo、grpo 等等&#xff09;。 过去对 rl 的理解很粗浅&#xff08;只知道有好多个角色&#xff0c;有的更新权重&#xff0c;有的不更新&#xff09;&#xff0c;也曾硬着头皮看了一些论文和知…

rk3588 上运行smolvlm-realtime-webcam,将视频转为文字描述

smolvlm-realtime-webcam 是一个开源项目&#xff0c;结合了轻量级多模态模型 SmolVLM 和本地推理引擎 llama.cpp&#xff0c;能够在本地实时处理摄像头视频流&#xff0c;生成自然语言描述&#xff0c; 开源项目地址 https://github.com/ngxson/smolvlm-realtime-webcamhttps…

Rust 学习笔记:Box<T>

Rust 学习笔记&#xff1a;Box Rust 学习笔记&#xff1a;Box<T\>Box\<T> 简介使用 Box\<T\> 在堆上存储数据启用带有 box 的递归类型关于 cons 列表的介绍计算非递归类型的大小使用 Box\<T\> 获取大小已知的递归类型 Rust 学习笔记&#xff1a;Box<…

操作系统学习(十三)——Linux

一、Linux Linux 是一种类 Unix 的自由开源操作系统内核&#xff0c;由芬兰人 Linus Torvalds 于 1991 年首次发布。如今它广泛应用于服务器、桌面、嵌入式设备、移动设备&#xff08;如 Android&#xff09;等领域。 设计思想&#xff1a; 原则描述模块化与可移植性Linux 内…

NLP学习路线图(二十二): 循环神经网络(RNN)

在自然语言处理&#xff08;NLP&#xff09;的广阔天地中&#xff0c;序列数据是绝对的核心——无论是流淌的文本、连续的语音还是跳跃的时间序列&#xff0c;都蕴含着前后紧密关联的信息。传统神经网络如同面对一幅打散的拼图&#xff0c;无法理解词语间的顺序关系&#xff0c…

每日一C(1)C语言的内存分布

目录 代码区 常量区 全局/静态区 初始化数据段&#xff08;.data&#xff09; 未初始化数据段&#xff08;.bss&#xff09; 堆区 栈区 总结 今天我们学习的是C语言的内存分布&#xff0c;以及这些分区所存储的内容和其特点。今天的思维导图如下。 C语言作为一款直接处…

Photoshop使用钢笔绘制图形

1、绘制脸部路径 选择钢笔工具&#xff0c;再选择“路径”。 基于两个点绘制一个弯曲的曲线 使用Alt键移动单个点&#xff0c;该点决定了后续的曲线方向 继续绘制第3个点 最后一个点首尾是同一个点&#xff0c;使用钢笔保证是闭合回路。 以同样的方式绘制2个眼睛外框。 使用椭…

应用层协议:HTTP

目录 HTTP&#xff1a;超文本传输协议 1.1 HTTP报文 1.1.1 请求报文 1.1.2 响应报文 1.2 HTTP请求过程和原理 1.2.1 请求过程 1、域名&#xff08;DNS&#xff09;解析 2、建立TCP连接&#xff08;三次握手&#xff09; 3、发送HTTP请求 4、服务器处理请求 5、返回H…

复习——C++

1、scanf和scanf_s区别 2、取地址&#xff0c;输出 char ba; char* p&b; cout<<*p; cout<<p; p(char*)"abc"; cout<<*p; cout<<p; cout<<(void*)p; 取地址&#xff0c;把b的地址给p 输出*p&#xff0c;是输出p的空间内的值…

SPI通信协议(软件SPI读取W25Q64)

SPI通信协议 文章目录 SPI通信协议1.SPI通信2.SPI硬件和软件规定2.1SPI硬件电路2.2移位示意图2.3SPI基本时序单元2.3.1起始和终止条件2.3.2交换一个字节&#xff08;模式1&#xff09; 2.4SPI波形分析&#xff08;辅助理解&#xff09;2.4.1发送指令2.4.2指定地址写2.4.3指定地…

JavaWeb:前后端分离开发-部门管理

今日内容 前后端分离开发 准备工作 页面布局 整体布局-头部布局 Container 布局容器 左侧布局 资料\04. 基础文件\layout/index.vue <script setup lang"ts"></script><template><div class"common-layout"><el-containe…

字节开源FlowGram:AI时代可视化工作流新利器

字节终于开源“扣子”同款引擎了&#xff01;FlowGram&#xff1a;AI 时代的可视化工作流利器 字节FlowGram创新性地融合图神经网络与多模态交互技术&#xff0c;构建了支持动态拓扑重构的可视化流程引擎。该系统通过引入 f ( G ) ( V ′ &#xff0c; E ′ ) f(\mathcal{G})…

(LeetCode 每日一题)3403. 从盒子中找出字典序最大的字符串 I (贪心+枚举)

题目&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 题目&#xff1a;贪心枚举字符串&#xff0c;时间复杂度0(n)。 最优解的长度一定是在[1,n-numFriends]之间。 字符串在前缀都相同的情况下&#xff0c;长度越长越大。 C版本&#xff1a; class Solution { public:st…