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

sqlite3相关经验记录

记录工作中使用sqlite3

基本使用类封装

头文件

using SQL_RES = std::vector<std::map<std::string, std::string>>;

class CSqliteDb 
{
public:
    CSqliteDb();
    ~CSqliteDb();
    void InitDb();
    bool execSql(const char* sqlStr);
    /*
    ** 查询语句
    ** result 结果集
    */
    bool execSelect(const char* sqlStr , SQL_RES& result);
private:
    sqlite3 *m_db;
};

源文件

CSqliteDb::CSqliteDb() {
    m_db = NULL;
    InitDb();
}

CSqliteDb::~CSqliteDb() {
    if(m_db) {
        sqlite3_close(m_db);
    }
}

bool CSqliteDb::execSql(const char* sqlStr) {
    spdlog::info("exec sql: {}",sqlStr);
    char *errMsg;
    int ret = sqlite3_exec(m_db ,sqlStr , 0 , 0 , &errMsg);
    if(ret != SQLITE_OK) {
        SPDLOG_LOGGER_ERROR(spdlog::get("skyense"),"[SQL] error: {} , sql: {}" , errMsg , sqlStr);
        sqlite3_free(errMsg);
        return false;
    }
    return true;
}

bool CSqliteDb::execSelect(const char* sqlStr , std::vector<std::map<std::string, std::string>> &result) {
    bool retflg = false;
    char *errMsg;
    char **dbResult;
    int nRow = 0, nColumn = 0;
    int ret;
    spdlog::info("sql: {}" , sqlStr);
    ret = sqlite3_get_table(m_db , sqlStr , &dbResult , &nRow , &nColumn , &errMsg);
    spdlog::info("row : {} , column : {}" , nRow , nColumn);
    if(ret == SQLITE_OK) {
        for(int i = 1 ; i < nRow + 1 ; ++i) {
            std::map<std::string,std::string> valueMap;
            for(int j = 0 ; j < nColumn ; ++j) {
                if(dbResult[(i * nColumn) + j] != NULL) {
                    valueMap[dbResult[j]] = dbResult[(i * nColumn) + j];
                } else {
                    valueMap[dbResult[j]] = "";
                }
            }
            result.emplace_back(valueMap);
        }
        sqlite3_free_table(dbResult);
        retflg = true;
    } else {
        SPDLOG_LOGGER_ERROR(spdlog::get("skyense") , "select error : {} , sql: {}" , errMsg , sqlStr);
    }
    sqlite3_free(errMsg);
    return retflg;
}

触发器的使用

触发器就理解为数据库的回调函数,哪个表发生了哪个事件触发回调,可以让数据库自己处理对应关联的信息同步问题,不需要在代码里去实现,个人觉得相当方便。

查询创建的触发器

SELECT name FROM sqlite_master WHERE type = 'trigger';

在这里插入图片描述

创建触发器

CREATE TRIGGER task_del AFTER DELETE ON media begin delete from algoTask where devSerial=old.devSerial; end;

http://www.kler.cn/a/400504.html

相关文章:

  • 微信小程序上传pdf和显示
  • 使用python编写工具:快速生成chrome插件相关文件结构
  • iOS逆向入门:使用theos注入第三方依赖库
  • KUKU FM 音频Linux平台免费下载工具
  • 防火墙----iptables
  • 鸿蒙next版开发:拍照实现方案(ArkTS)
  • llm 从0开始学习大语言模型, transformer架构学习
  • Rust “xxx“.to_string()和Rust String::from(“xxx“)区别(将字符串字面量(str类型)转换为String类型)
  • 数学建模——模型假设环节介绍
  • 基于单片机的手持金属探测仪设计
  • UE5入门教程:蓝图变量
  • 表格的选择弹窗,选中后返显到表格中
  • 在应用启动时,使用 UniApp 提供的 API 检查和请求权限。
  • 避免误差!Android 中正确计算时间差的方式
  • 网页web无插件播放器EasyPlayer.js H.265流媒体播放器的decoder.js报Unexpected token ‘<‘错误
  • 大麦抢票科技
  • [AI] 如何让计算机具备核心直觉知识:从常识推理到具身智能
  • 高并发的API请求有哪些注意事项?
  • 2024版本IDEA创建Sprintboot项目下载依赖缓慢
  • 正在执行例行维护 请一分钟后回来