一个C++版本的Sqlite3封装--SmartDb
Sqlite是一个非常轻量级的开源数据库,在嵌入式系统中使用的比较多,存储管理数据非常方便,Sqlite库提供的基于C语言的API,用起来也挺简单,但是有一点不太好的就是API使用起来有些繁琐,另外就是不同的场合,代码复用率很低,又要重新写代码,增加了工作量,代码要尽量复用,才有价值。SmartDB对sqlite做了一层封装(基于C++11的模板元编程),屏蔽了诸多细节,使得我们使用起来很方便。在注重易用性的基础上还兼顾了性能和灵活性。
SmartDb是《深入应用C++11 代码优化与工程级应用》的作者编写的,SmartDb使用了很多C++11新特性:可变长参数、模板元编程、完美转发、泛型编程等,代码质量非常高,很值得学习,使用C++做开发的同学不妨看看,网上有电子版的。
使用这个SmartDb去操作数据库就简单多了:
来看下示例代码:
void TestPerformance()
{
SmartDB db;
db.Open("test.db"); //打开数据库
const string sqlcreat = "CREATE TABLE if not exists TestInfoTable(ID INTEGER NOT NULL, KPIID INTEGER, CODE INTEGER, V1 INTEGER, V2 INTEGER, V3 REAL, V4 TEXT);";
if (!db.Excecute(sqlcreat)) //执行sql语句
return;
boost::timer t;
const string sqlinsert = "INSERT INTO TestInfoTable(ID, KPIID, CODE, V1, V2, V3, V4) VALUES(?, ?, ?, ?, ?, ?, ?);";
bool ret = db.Prepare(sqlinsert);
db.Begin();
for (size_t i = 0; i < 10; i++) //00000
{
ret = db.ExcecuteArgs(i, i, i, i, i, i + 1.25, "it is a test");
if (!ret)
break;
}
if (ret)
db.Commit(); //提交事务
else
db.RollBack(); //回滚
cout << t.elapsed() << endl;
t.restart();
//100w 3.5-4秒左右
auto p = db.Query("select * from TestInfoTable");
cout << t.elapsed() << endl;
cout << "size: " << p->Size() << endl;
//100W 4秒左右
rapidjson::StringBuffer buffer;
rapidjson::PrettyWriter<rapidjson::StringBuffer> pretty_writer(buffer); //PrettyWriter是格式化的json,如果是Writer则是换行空格压缩后的json
p->Accept(pretty_writer);
//打印到屏幕
//cout<<"the json output:"<<endl;
cout<<buffer.GetString()<<endl;
//遍历查询结果
rapidjson::Value& infoArray = *p;
for ( int i = 0; i < p->Size(); ++i )
{
const rapidjson::Value& object = infoArray[i];
printf("%d. Id: %d KpiId: %d, v3: %f, v4: %s\n",i,
object["ID"].GetInt(), object["KPIID"].GetInt(),object["V3"].GetDouble(),object["V4"].GetString());
}
}
查询的数据库时,结果是以Json格式返回的,这里返回的是一个json数组,这个用起来很方便。
作者的源代码是VS下编译测试的,我在VS2015下可以编译运行,在Linux下编译有点问题,可能是编译器的差异造成的,目前只编译通过部分,
ExcecuteTuple接口还用不了,
Variant的Visit接口编译不通过,注释掉可以通过,这这里好像也没有用到;
大家如果在Linux下编译通过,正常运行告诉我下哈。
在linux下编译通过的版本(码云地址):https://gitee.com/fensw/SmartDB
作者原文:
https://www.cnblogs.com/qicosmos/p/3805156.html
欢迎关注我微信订阅号:

一个C++版本的Sqlite3封装--SmartDb的更多相关文章
- (原创)发布一个C++版本的ORM库SmartDB(一)
先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...
- 发布一个C++版本的ORM库SmartDB
先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...
- faster_rcnn c++版本的 caffe 封装(1)
转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 由于需要把FasterRCNN做的工程化,因此这里需要对Caff ...
- 无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本。
引自:http://www.cnblogs.com/chillsrc/archive/2010/06/28/1766816.html 安装完VS2010中文版之后,又安装了Silverlight4_T ...
- 51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...
- 升级SilverLight为5.1.50907.0后,VS调试时报“无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本”的处理办法
作者: zyl910 一.问题 今天需要调试一个SilverLight程序.运行时ie弹出了一个升级提示,于是手贱点了升级. 随后便悲剧了,VS调试时报"无法启动调试--未安装 Silver ...
- ThinkPHP 的一个神秘版本 ThinkPHP 1.2
ThinkPHP 的一个神秘版本 ThinkPHP 1.2 询问过 ThinkPHP 官网的小伙伴都知道,偶尔 ThinkPHP 故障时会出现 ThinkPHP 1.2(下次看到就截图下来). 但是我 ...
- [经验]微信开放平台,一个APP secret可以绑定一个APP,然后再绑定一个ipad 版本APP
微信开放平台,一个APP secret可以绑定一个APP,然后再绑定一个ipad 版本APP
- 实现一个 WPF 版本的 ConnectedAnimation
Windows 10 的创造者更新为开发者们带来了 Connected Animation 连接动画,这也是 Fluent Design System 的一部分.它的视觉引导性很强,用户能够在它的帮助 ...
随机推荐
- keepalived 热备
概述 keepalived高可用集群 keepalived最初是为了LVS的,因为LVS无法进行自动检测服务器的节点状态(可以自动部署LVS) keeplived后来加入VRRP给功 ...
- (四)pandas的拼接操作
pandas的拼接操作 #重点 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 0. 回顾numpy的级联 import num ...
- 05 drf源码剖析之认证
05 drf源码剖析之认证 目录 05 drf源码剖析之认证 1. 认证简述 2. 认证的使用 3. 源码剖析 4. 总结 1. 认证简述 当我们通过Web浏览器与API进行交互时,我们可以登录,然后 ...
- 最佳开发工具大全,GitHub Star 6.2k+
一位曾经的谷歌工程师,花费两年时间,辛苦整理了一份清单.本文转自量子位,作者晓查.栗子.方驭洋,如有侵,可删! 这个名为 "xg2xg" 的清单,原本是这位前谷歌工程师(ex-Go ...
- JavaScript图形实例:阿基米德螺线
1.阿基米德螺线 阿基米德螺线亦称“等速螺线”.当一点P沿动射线OP以等速率运动的同时,该射线又以等角速度绕点O旋转,点P的轨迹称为“阿基米德螺线”. 阿基米德螺线的笛卡尔坐标方程式为: r=10*( ...
- commons-fileload图片文件上传工具 , servlet文件图片上传案列
本案列是java maven工程小项目,提供个大家学习! 1.在pom.xml文件中导入依赖: <!--文件上传依赖--><dependency> <groupId&g ...
- 关于Java8的精心总结
前言 最近公司里比较新的项目里面,看到了很多关于java8新特性的用法,由于之前自己对java8的新特性不是很了解也没有去做深入研究,所以最近就系统的去学习了一下,然后总结了一篇文章第一时间和大家 ...
- 少儿编程:python趣味编程第一课
本文仅针对8-16岁的青少年,所以流程是按如何去教好中小学生走的,并不适合成人找工作学习,因为进度也是按照青少年走的 大家好,我是C大叔,从事少儿编程行业三年有余(2016年从事少儿编程行业,少儿编程 ...
- vue学习(十) v-for循环普通数组 、对象数组、 迭代数字
//html <div id="app"> <p v-for="item in list">{{item}}</p> < ...
- MySQL组复制MGR(二)-- 组复制搭建
(一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...