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

SQLiteCpp 快速上手:5 分钟用现代 C++ 优雅操作 SQLite3 数据库

SQLiteCpp 快速上手:5 分钟用现代 C++ 优雅操作 SQLite3 数据库

【免费下载链接】SQLiteCppSQLiteC++ (SQLiteCpp) is a smart and easy to use C++ SQLite3 wrapper.项目地址: https://gitcode.com/gh_mirrors/sq/SQLiteCpp

当你只是想在一个 C++ 程序里存点配置、记几笔账,却被 SQLite 原生 C 接口的 prepare、bind、step、finalize 连环调用折磨时——SQLiteCpp 这个轻量级 C++ SQLite3 包装器,就是为你准备的解药。它把底层繁琐的 C API 封装成几个直观的 C++ 类,让你可以用写普通 C++ 的思维方式操作数据库。

包装器(wrapper)通俗讲,就是把难用的底层接口"包"上一层好用的壳,你只管用壳,不用碰里面那些细节。

被 C API 折磨过的 C++ 开发者,都懂这种感觉

你大概经历过这样的场景:数据库操作本来只是程序的一小部分,却要写一堆sqlite3_prepare_v2sqlite3_bind_intsqlite3_stepsqlite3_finalize,还要小心翼翼地判断每个返回值、手动释放每个指针。代码又长又容易出错,一不留神就内存泄漏或者忘记检查错误。

SQLiteCpp 想解决的正是这件事:让 C++ 里的 SQLite 操作,简单到像写一句普通代码

一句话:SQLiteCpp 到底做什么

SQLiteCpp 是一个基于 C++11 的 SQLite3 包装库,遵循 RAII(资源获取即初始化)设计——对象构造时自动打开连接,析构时自动释放资源,出错统一抛异常。你不需要关心底层指针的生命周期,也不需要逐行检查错误码,代码量通常能缩到原来的三分之一以下。

哪些人适合用它

  • C++ 桌面/嵌入式开发者:需要本地存储,又不想引入重量级数据库
  • 游戏与工具软件作者:存档、配置、用户数据,一个文件全搞定
  • 正在写课程设计/毕设的学生:API 直观、文档齐全,几分钟就能跑起来
  • 想给老项目加数据能力的维护者:静态库接入,几分钟完成集成

三步完成安装与首次运行

第一步:拿到代码。克隆仓库即可,无需额外初始化子模块也能编译核心库:

git clone https://gitcode.com/gh_mirrors/sq/SQLiteCpp

第二步:接入你的 CMake 项目。在 CMakeLists.txt 里加上几行,把它当作子目录编译成静态库:

# 把 SQLiteCpp 加入构建 add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp) add_executable(your_app src/main.cpp) target_link_libraries(your_app SQLiteCpp # 包装库 sqlite3 # 底层 SQLite 库 pthread dl # Linux 下需要 )

第三步:写第一段代码。打开数据库、查询、取结果,全部用熟悉的 C++ 风格完成:

#include <SQLiteCpp/SQLiteCpp.h> #include <iostream> try { // 打开数据库(默认只读模式) SQLite::Database db("example.db3"); // 编译一条带参数的查询语句 SQLite::Statement query(db, "SELECT * FROM users WHERE age > ?"); query.bind(1, 18); // ? 是占位符,这里绑定参数 18 // 逐行取结果 while (query.executeStep()) { std::cout << query.getColumn(1).getText() << " 岁数 " << query.getColumn(2).getInt() << std::endl; } } catch (const std::exception& e) { std::cerr << "数据库错误: " << e.what() << std::endl; }

跑起来了吗?✅ 如果报undefined reference to sqlite3_xxx,说明系统缺 SQLite 开发库,安装libsqlite3-dev即可(Debian/Ubuntu 系)。

实战小项目:20 行代码写一个命令行记账本

光看不练不过瘾,我们把主要 API——建表、预处理插入、查询、事务——串起来,做一个简单的记账 Demo。保存下面代码为ledger.cpp,编译运行即可看到效果:

#include <SQLiteCpp/SQLiteCpp.h> #include <iostream> int main() { try { // 打开(不存在则创建)数据库 SQLite::Database db("ledger.db3", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE); db.exec("CREATE TABLE IF NOT EXISTS bills " "(id INTEGER PRIMARY KEY, item TEXT, amount REAL)"); // 预处理语句:编译一次,绑定参数,防注入又高效 SQLite::Statement insert(db, "INSERT INTO bills (item, amount) VALUES (?, ?)"); insert.bind(1, "咖啡"); // 绑定字符串 insert.bind(2, 25.5); // 绑定浮点数 insert.exec(); // 用事务批量再插入两条,出错会自动回滚 { SQLite::Transaction transaction(db); SQLite::Statement batch(db, "INSERT INTO bills (item, amount) VALUES (?, ?)"); batch.bind(1, "地铁"); batch.bind(2, 3.0); batch.exec(); batch.reset(); batch.bind(1, "午饭"); batch.bind(2, 32.0); batch.exec(); transaction.commit(); // 全部成功才提交 } // 查询并打印所有账单 SQLite::Statement query(db, "SELECT id, item, amount FROM bills"); while (query.executeStep()) { std::cout << query.getColumn(0).getInt() << " | " << query.getColumn(1).getText() << " | " << query.getColumn(2).getDouble() << " 元\n"; } } catch (const std::exception& e) { std::cerr << "数据库错误: " << e.what() << std::endl; } return 0; }

这个 Demo 把 SQLiteCpp 的核心玩法都覆盖了:Database负责连接、Statement负责参数化查询、Transaction保证数据要么全部写入、要么一点不动。试着改改金额、加个 WHERE 条件,马上就能体会到这套 API 的手感。✨

进阶能力速览

能力一句话亮点
预处理语句编译一次、重复绑定,天然免疫 SQL 注入
事务(Transaction)自动提交/回滚,批量写入性能提升明显
变参绑定SQLite::bindC++14 起一行代码绑定全部参数,告别逐个 bind
BLOB 二进制读写图片、文件可以直接存进数据库再读出来
内存数据库:memory:零文件起步,测试与临时计算的好帮手
数据库备份 Backup一个 API 完成整体备份与恢复
自定义 SQL 函数把你的 C++ 函数注册成 SQL 函数,直接在查询里调用
加密接口 key/rekey配合加密版 SQLite,落盘数据即加密
版本信息getLibVersion()取运行库版本,SQLite::VERSION取编译版本

更详细的接口说明都在项目头文件里,每个类和方法都带 Doxygen 注释,查起来非常方便。

新手最容易踩的 5 个坑

1. 打开数据库时忘了加写权限⚠️ SQLiteCpp 默认以只读模式打开数据库。想建表、插入数据,必须写成:

SQLite::Database db("test.db3", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);

否则会抛出 "unable to open database file" 异常。

2. 编译报 undefined reference to sqlite3_xxx说明没链接 SQLite 库。Debian/Ubuntu 系安装libsqlite3-dev,或在 CMake 里开启项目自带的SQLITECPP_INTERNAL_SQLITE选项使用内置源码。

3.execAndGet的结果要立刻拷贝它返回的是临时对象的引用,必须当场赋值给变量,例如std::string v = db.execAndGet(...),否则下一条语句执行后数据就失效了。

4. 一个数据库连接不能跨线程共用SQLiteCpp 支持 SQLite 的"多线程"模式:多个线程可以各用各的连接,但同一个Database对象不能同时在两个线程里操作。需要多线程,就为每个线程开独立连接。

5. 析构函数里报断言C++ 不允许在析构函数里抛异常,所以 SQLiteCpp 在析构阶段用断言检查错误。如果不想触发默认的assert,编译时定义SQLITECPP_ENABLE_ASSERT_HANDLER宏,并自定义SQLite::assertion_failed处理函数即可。

资源与下一步

想深入探索,可以看这几个地方:

  • 官方 README 与构建说明:README.md
  • 综合示例(查询、事务、BLOB、内存库全演示):examples/example1/main.cpp
  • 完整单元测试(也是最好的 API 用法参考):tests/
  • 版本变更记录:CHANGELOG.md

SQLiteCpp 的核心理念就是"简单而强大":MIT 许可、零额外依赖、跨 Linux/Windows/macOS,你几乎不需要学习成本就能上手。现在就去克隆一份,用那 20 行记账本 Demo 跑通你的第一个 SQLiteCpp 程序——动手之后你会发现,C++ 里操作数据库,原来可以这么清爽。💪

【免费下载链接】SQLiteCppSQLiteC++ (SQLiteCpp) is a smart and easy to use C++ SQLite3 wrapper.项目地址: https://gitcode.com/gh_mirrors/sq/SQLiteCpp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4100754.html

相关文章:

  • 还在被魔兽争霸3的老毛病折磨?WarcraftHelper优化工具保姆级上手指南
  • Whisky 使用完整指南:不装虚拟机、不花一分钱,在 Apple Silicon Mac 上畅跑 Windows 软件的终极方案
  • Boss-Key 老板键使用指南:一张能力清单,讲透窗口隐藏、静音与进程冻结
  • 5分钟上手Whisky:让macOS轻松运行Windows软件的完整指南
  • 久别重逢,一份信物寄托岁岁期许
  • 从Codex配置陷阱到长上下文本质:如何系统评估与落地大模型工程方案
  • STL在CAD里改不动?stltostp让STL转STEP只用一条命令
  • AMD Ryzen调试工具实战:5个技巧解锁SMU寄存器与曲线优化潜能
  • QSFP/QSFP-DD/OSFP 通用管理接口规范(CMIS)解读:09 Page 11h
  • 用眼休息提醒软件Project Eye实测:每天20秒,真的能告别眼干眼涩吗
  • Midscene.js实战指南:如何用视觉AI替代脆弱选择器,一套自然语言搞定Web到手机的UI自动化测试
  • Elmer FEM实战:如何用免费开源工具完成一次真实的多物理场仿真
  • 锤子助手第112个开关:启用笔记复读的位置、验证方法与混合内容隐私边界
  • 键盘连击修正终极指南:Keyboard Chatter Blocker 逐键防抖完全上手
  • UE4SS DLL加载失败终极排查手册:5站走通Lua注入报错与系统级劫持的完整修复路线
  • WVP-PRO国标GB28181视频平台完整上手指南:一条命令启动,5分钟接入第一批摄像头
  • BiliBili-UWP 完整上手指南:免费开源的 B 站第三方客户端,Windows 桌面观影更顺滑
  • SAGE社交感知生成引擎:异构多智能体导航的生成式路径规划实践
  • 告别付费墙:Wand-Enhancer 本地解锁 WeMod Pro 的完整实操指南(附手机远程控制玩法)
  • WindowResizer窗口大小调整快速上手指南:4步强制改掉任意顽固窗口
  • Seeed Studio XIAO nRF54LM20A开发板实战:从环境搭建到低功耗AI应用
  • 换服必丢角色?用 palworld-host-save-fix 做一次帕鲁存档迁移,从此不怕“创建新角色“
  • FreeRTOS计数信号量:从资源管理到生产者-消费者模型实战
  • FreeRTOS队列深度解析:从原理到实战,掌握嵌入式多任务通信核心
  • L4级自动驾驶巴士量产背后的技术栈与工程化挑战
  • Elmer FEM多物理场仿真从零到实战:一文吃透开源工程软件核心玩法
  • 基于ESP32与WS2812B的智能RGB氛围灯DIY:从硬件选型到网络控制全解析
  • 英文简历不会写怎么办?5款AI工具实测+英文Resume写作模板,外企求职不再被ATS淘汰
  • AE/PR/FCPX动态模板高效使用指南:从解构到创意应用
  • Magnet2Torrent终极指南:如何把磁力链接快速转换为可永久保存的种子文件