文档章节

A SQLite client library written in Modern C++

chxuan
 chxuan
发布于 2016/07/15 11:14
字数 737
阅读 7
收藏 0

smartdb是一个纯c++11开发,header-only,简洁高效的sqlite封装库.

github地址:https://github.com/chxuan/smartdb,如果您觉得不错,请不要吝啬给个start!

  • 连接数据库,若test.db不存在,则会创建一个.

    db.open("test.db")
    
  • INSERT操作.

    std::string sql = "INSERT INTO PersonTable(id, name, address) VALUES(?, ?, ?)";
    db.execute(sql, 1, "Jack", nullptr);
    

或者可以这样写: cpp std::string sql = "INSERT INTO PersonTable(id, name, address) VALUES(?, ?, ?)"; db.execute(sql, std::forward_as_tuple(1, "Jack", nullptr)); 正如你所看到的,execute支持变参和std::tuple作为变量替换SQL里面的?,其中nullptr可以将数据库字段设置成null值,若要进行批量插入,建议使用事务和prepare进行处理,具体操作请看Example

  • SELECT操作

    db.execute("SELECT * FROM PersonTable");
    while (!db.isEnd())
    {
        std::cout << "id: " << db.getFiled<sqlite3_int64>(0) << std::endl;
        std::cout << "name: " << db.getFiled<std::string>(1) << std::endl;
        std::cout << "address: " << db.getFiled<std::string>(2) << std::endl;
        db.moveNext();
    }
    

使用isEndmoveNext即可遍历结果集,获取字段值需要提供字段的类型以及字段序号,没有使用字段名来代替字段序号来获取值,主要是考虑到效率问题。

  • 使用聚合函数

    db.execute("SELECT COUNT(*) FROM PersonTable");
    if (db.recordCount() == 1 && !db.isEnd())
    {
        std::cout << db.getFiled<sqlite3_int64>(0) << std::endl;
    }
    

Example

#include <iostream>
#include <fstream>
#include "Timer.hpp"
#include "smartdb/Database.hpp"

void testInsertTable()
{
    smartdb::Database db;
    bool ok = db.open("test.db");

    std::string sql = "DROP TABLE PersonTable";
    ok = db.execute(sql);

    sql = "CREATE TABLE if not exists PersonTable(id INTEGER NOT NULL, name Text, address Text)";
    ok = db.execute(sql);

    Timer t;
    sql = "INSERT INTO PersonTable(id, name, address) VALUES(?, ?, ?)";
    const char* name = "Jack";
    std::string city = "Chengdu";

    // 预处理sql.
    ok = db.prepare(sql);

    // 开始事务.
    ok = db.begin();

    bool ret = true;
    for (int i = 1; i < 1000000; ++i)
    {
        // 绑定参数.
        /* ret = db.addBindValue(std::forward_as_tuple(i, name, city)); */
        ret = db.addBindValue(i, name, city);
        if (!ret)
        {
            std::cout << "Error message: " << db.getErrorMessage() << std::endl;
            break;
        }
    }
    if (ret)
    {
        // 提交事务.
        ok = db.commit();
    }
    else
    {
        // 回滚事务.
        ok = db.rollback();
    }

    // 100w 800~1000ms.
    std::cout << "Insert elapsed: " << t.elapsed() << std::endl;

    t.reset();
    // select.
    ok = db.execute("SELECT * FROM PersonTable");
    std::cout << "Record count: " << db.recordCount() << std::endl;
    while (!db.isEnd())
    {
        db.moveNext();
    }
    // 100w 300~500ms.
    std::cout << "Select elapsed: " << t.elapsed() << std::endl;
    (void)ok;
}

void testInsertTable2()
{
    smartdb::Database db;
    bool ok = db.open("test.db");

    std::string sql = "DROP TABLE PersonTable2";
    ok = db.execute(sql);

    sql = "CREATE TABLE if not exists PersonTable2(id INTEGER NOT NULL, name Text, address Text, headerImage BLOB)";
    ok = db.execute(sql);

    // 读取一张图片.
    std::ifstream fin;
    fin.open("./1.jpg", std::ios::binary);
    ok = fin.is_open();
    char buf[50 * 1025] = {"\0"};
    fin.read(buf, sizeof(buf));
    std::string image = std::string(buf, fin.gcount());
    smartdb::Blob headImage;
    headImage.buf = image.c_str();
    headImage.size = image.length();

    sql = "INSERT INTO PersonTable2(id, name, address, headerImage) VALUES(?, ?, ?, ?)";
    for (int i = 0; i < 10; ++i)
    {
        /* ok = db.execute(sql, i, "Tom", nullptr, headImage); */
        ok = db.execute(sql, std::forward_as_tuple(i, "Tom", nullptr, headImage));
    }

    // update.
    sql = "UPDATE PersonTable2 SET address=? WHERE id=?";
    if (!db.execute(sql, "中国", 0))
    {
        std::cout << "Error message: " << db.getErrorMessage() << std::endl;
        return;
    }
    std::cout << "Update success, affected rows: " << db.affectedRows() << std::endl;

    // select.
    ok = db.execute("SELECT * FROM PersonTable2 WHERE id=?", 0);
    /* ok = db.execute("SELECT * FROM PersonTable2"); */
    while (!db.isEnd())
    {
        try
        {
            std::cout << "id: " << db.getFiled<sqlite3_int64>(0) << std::endl;
            std::cout << "name: " << db.getFiled<std::string>(1) << std::endl;
            std::cout << "address: " << db.getFiled<std::string>(2) << std::endl;
            std::cout << "image size: " << db.getFiled<std::string>(3).size() << std::endl;
        }
        catch (std::exception& e)
        {
            std::cout << "Exception: " << e.what() << std::endl;
            return;
        }
        db.moveNext();
    }

    ok = db.execute("SELECT COUNT(*) FROM PersonTable2");
    if (db.recordCount() == 1 && !db.isEnd())
    {
        std::cout << "COUNT(*): " << db.getFiled<sqlite3_int64>(0) << std::endl;
    }
    (void)ok;
}

int main()
{
    testInsertTable();
    testInsertTable2();

    return 0;
}

依赖性

  • boost.variant
  • c++11

兼容性

  • Linux x86_64 gcc 4.8, gcc4.9, gcc 5.
  • Windows x86_64 Visual Studio 2015

© 著作权归作者所有

共有 人打赏支持
chxuan
粉丝 0
博文 1
码字总数 737
作品 0
成都
私信 提问
受 SQLite 多年青睐,C 语言到底好在哪儿?

SQLite 近日发表了一篇博文,解释了为什么多年来 SQLite 一直坚持用 C 语言来实现,以下是正文内容: C 语言是最佳选择 从2000年5月29日发布至今,SQLite 一直都是用 C 语言实现。C 一直是实...

王练
2018/08/31
5.3K
31
sqlite的创建数据库,表,插入查看数据

IOS sqlite数据库操作。步骤是: 先加入sqlite开发库libsqlite3.dylib, 新建或打开数据库, 创建数据表, 插入数据, 查询数据并打印 1、新建项目sqliteDemo,添加使用sqlite的库libsqlite3....

jackyyang
2012/07/15
0
0
ODB(C++ ORM)用Mingw的完整编译过程

用mingw官方的GCC4.7.2编译libodb后,并用odb compiler对hello示例生成odb的"包裹"代码,编译链接总是不能通过,下面是编译example/hello报错的信息如下: libodb-sqlite-2.3.0/odb/sqlite -o d...

棋有此理
2013/12/14
0
0
SQLite快速入门

SQLite小巧的特点使其在嵌入式上利用很广泛。越来越多的移动设备上加入了SQLite模块,android,sysmbian, iphone,...下面的介绍让你快速步入SQLite的大门。 1. 下载 SQLite是开源的项目,所以...

长平狐
2012/08/13
163
0
发布至今18年,为什么SQLite一定要用C语言来开发?

SQLite 选择 C 语言的理由是?为什么不选择 Go 或者 Rust? C 语言是最好的 SQLite 在 2000 年 5 月 29 日发布,并一直使用 C 语言实现。C 语言一直是实现 SQLite 这类软件库的最佳语言,目前...

程序师
2018/08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式事务解决方案框架(LCN)

什么是XA接口 XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口...

群星纪元
8分钟前
0
0
linux 操作系统 常用命令和软件安装

1.系统时间更新 ntpdate time.windows.com 2.传送文件 rsync -av /home/data/a.dat -e ssh root@192.168.0.100:/home 3.传送文件夹 scp -r /home/data root@192.168.0.100:/home 4.JDK安装 ......

WJtiny
30分钟前
0
0
pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
38分钟前
2
0
对比剖析Swarm Kubernetes Marathon编排引擎

Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目。Docker原生集群(Swarm)同时包括了(Docker Engine \/ Daemons)...

Linux就该这么学
39分钟前
2
0
Mybatis的结果集处理

此时我们已经可以把整段的SQL语句取出,但还并没有在数据库中去执行,我们可以先来分析一下配置文件中SQL语句执行后的结果集是如何处理的。 Mybatis会将结果集按照映射配置文件中定义的映射规...

算法之名
51分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部