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

基于C++的ORM框架sqlpp11入门介绍(附MySQL运行实例)

基本介绍

sqlpp11 是 C++ 的类型安全的 SQL 模版库。

Sqlpp11的官方下载地址是,

GitHub - rbock/sqlpp11: A type safe SQL template library for C++

在这里,可以找到官方的详细介绍文档,

https://github.com/rbock/sqlpp11/tree/main/docs

作者在介绍页面上是这样描述sqlpp11的,

A type safe embedded domain specific language for SQL queries and results in C++.

在C++领域,用于 SQL 查询及结果检查的类型安的全嵌入式域特定语言。

这句话到底是什么意思呢?

我们知道,SQL 和 C++ 都是强类型语言。 尽管如此,大多数 C/C++ 的 SQL 接口都是基于将查询语句构造为字符串并将数组或字符串映射解释为结果;也就是说,用户其实是使用字符串对数据库进行操作。

然而,人们更期望在进行SQL操作时能更自然地,或者说更符合人们习惯地使用类型检查,并对数据库进行操作。

sqlpp11 是一个嵌入式领域特定语言 (EDSL) 的模板库,它允许用户,

  1. 定义表示表和列的类型,
  2. 构造类型安全查询,在编译时检查语法错误、类型错误、名称错误甚至一些语义错误,
  3. 通过使用适当命名和类型化的成员,迭代特定的查询的结构,以解释最终结果。

这带来了几个好处,例如

  1. 库用户可以轻松地操作结构和函数,
  2. 编译器早在代码进入单元测试或生产之前就报告了多种错误,
  3. 该库隐藏了用于查询和解释 select 调用返回结果的字符串构造的细节。

该库支持静态和动态查询。 前者在类型和一致性检查方面提供了更大的好处。 后者使得构建运行中的查询更加容易。

sqlpp11 的核心是供应商中立的。 数据库的特定特征(例如不支持或非标准功能)由连接器库处理。 连接器库可以在编译时通知开发人员缺少的功能。 他们还会在需要时专门解释表达式。 例如,连接器可以使用运算符|| 或者用于字符串连接的 concat 方法,而无需开发人员更改语句。

此存储库中包含 MariaDB、MySQL、PostgreSQL、sqlite3、sqlcipher 的连接器。

作者同时也说明,该库已经在生产中使用,但不算完全完成。

下面,我们简单地用一个MySQL的例子介绍一下,如何使用这个模板库。网上有人举了个sqlite3的例子,

C++ ORM框架:SQLPP11教程-CSDN博客

对应地,我们在这里改成MySQL的例子。

下载sqlpp11项目

首先是到官方的github网址上把项目拉下来,使用他的最新版v0.64,本地库命名为sqlpp11v064,如下,

git clone --recursive GitHub - rbock/sqlpp11: A type safe SQL template library for C++  -b v0.64  sqlpp11v064

因为sqlpp11依赖date库,本来希望recursive把库拉到适当的地方,最后使用cmake后,发现data下载到了项目的_deps中,

Cmake配置(Configure)后生成(Generate)项目,最后就可以用vs2019打开项目进行编译了。就我这里的配置而方,date的位置是在,

D:\vQt2024SQL\devSqlpp11v064\_deps\date-src\include

当然你也可以单独到这里下载,

GitHub - HowardHinnant/date: A date and time library based on the C++11/14/17 <chrono> header

要说明的是,sqlpp11本身是不需要编译的,她只有一些头文件,编译出来的其实都是一些测试可执行文件。

例如,测试mysql的sample所需要的sql文件在这里,

D:\vQt2024SQL\sqlpp11v064\tests\mysql\usage\TabSample.sql

生成的结果在这里,

D:\vQt2024SQL\sqlpp11v064\tests\mysql\usage\TabSample.h

如果你运行sqlpp11_mysql_tests这个项目,实际就是对该数据库进行测试操作,如下,

这里我们不对sqlpp11的官方测试代码进行过多的解读,只是简单以MySQL为例介绍一下使用方法。

创建测试项目

我们用vs2019新建一个sqlpp11Test01的项目。

首先,项目的路径依赖必须正确,依上所述,这里的路径依赖是,

D:\vQt2024SQL\sqlpp11v064\include;

D:\vQt2024SQL\devSqlpp11v064\_deps\date-src\include;

C:\Program Files\MySQL\MySQL Server 8.0\include;

库依赖只有libmysql,如下,

C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.lib;

生成SQL表的C++源码

假设我们需要进行操作的表格有以下SQL结构,

CREATE TABLE Student (
name  TEXT,
age   INTEGER
);

源码生成工具ddl2cpp在sqlpp11的scripts下面,

D:\vQt2024SQL\sqlpp11v064\scripts\ddl2cpp,

这里我们直接使用该工具生成Student.h文件,使用的指令为

python ddl2cpp Student.sql ./Student TestProject 

 

然后就可以看到头文件Student.h生成了,如下,

#pragma once// generated by ddl2cpp Student.sql ./Student TestProject#include <sqlpp11/table.h>
#include <sqlpp11/data_types.h>
#include <sqlpp11/char_sequence.h>namespace TestProject
{namespace Student_{struct Name{struct _alias_t{static constexpr const char _literal[] =  "name";using _name_t = sqlpp::make_char_sequence<sizeof(_literal), _literal>;template<typename T>struct _member_t{T name;T& operator()() { return name; }const T& operator()() const { return name; }};};using _traits = sqlpp::make_traits<sqlpp::text, sqlpp::tag::can_be_null>;};struct Age{struct _alias_t{static constexpr const char _literal[] =  "age";using _name_t = sqlpp::make_char_sequence<sizeof(_literal), _literal>;template<typename T>struct _member_t{T age;T& operator()() { return age; }const T& operator()() const { return age; }};};using _traits = sqlpp::make_traits<sqlpp::integer, sqlpp::tag::can_be_null>;};} // namespace Student_struct Student: sqlpp::table_t<Student,Student_::Name,Student_::Age>{struct _alias_t{static constexpr const char _literal[] =  "Student";using _name_t = sqlpp::make_char_sequence<sizeof(_literal), _literal>;template<typename T>struct _member_t{T Student;T& operator()() { return Student; }const T& operator()() const { return Student; }};};};
} // namespace TestProject

测试简单的增删改查操作

源码如下,

#include "sqlpp11/sqlpp11.h"
#include "sqlpp11/mysql/mysql.h"
#include "Student.h"
#include <sstream>
#include <stdlib.h>struct DEFECTINFO {int id;int type;std::string spath;std::string spos;
};int main(void)
{sqlpp::mysql::connection_config myconfig;myconfig.host = "localhost";myconfig.user = "root";myconfig.password = "";myconfig.database = "sqlpp_mysql";myconfig.debug = true;try{sqlpp::mysql::connection db(myconfig);TestProject::Student stu{};db.execute(R"(CREATE TABLE Student (name TEXT,age INTEGER))");// 单独插入一行db(insert_into(stu).set(stu.age = 12, stu.name = "one"));// 插入多行auto multi_insert = insert_into(stu).columns(stu.age, stu.name);for (int i = 0; i < 10; i++){std::ostringstream ostr;ostr << "linyiong" << i;multi_insert.values.add(stu.age = i, stu.name = ostr.str());}db(multi_insert);// 删除db(remove_from(stu).where(stu.age == 12));// 查询for (const auto& row : db(select(stu.name, stu.age).from(stu).where(stu.age > 1))){std::cout << row.name << ":" << row.age << std::endl;}// 更新db(update(stu).set(stu.name = "linyilong3").where(stu.age > 3));for (const auto& row : db(select(stu.name, stu.age).from(stu).where(stu.age > 1))){std::cout << row.name << ":" << row.age << std::endl;}}catch (std::exception& except){std::cout << except.what() << std::endl;}system("pause");
}

测试结果的输出如下,

使用MySQL workbend打开数据库,看到的结果如下,

本文结束

相关文章:

基于C++的ORM框架sqlpp11入门介绍(附MySQL运行实例)

基本介绍 sqlpp11 是 C 的类型安全的 SQL 模版库。 Sqlpp11的官方下载地址是&#xff0c; GitHub - rbock/sqlpp11: A type safe SQL template library for C 在这里&#xff0c;可以找到官方的详细介绍文档&#xff0c; https://github.com/rbock/sqlpp11/tree/main/docs…...

对写文章的想法

一些思考 思考初心现在错觉想说的话 最后 思考 在CSDN里面写文章已经快半年了啊&#xff0c;虽然更得不多&#xff0c;但每一篇都花费很多时间&#xff0c;写的时候能帮自己查漏补缺&#xff0c;这边找找资料补充一下&#xff0c;都能去拓展自己的知识面&#xff0c;让自己的文…...

Istio安装和基础原理

1、Istio简介 Istio 是一个开源服务网格&#xff0c;它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码。它强大的控…...

C++核心编程——基于多态的企业职工系统

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…...

Nginx服务安装

Nginx(发音为[engine x]&#xff09;专为性能优化而开发&#xff0c;其最知名的优点是它的稳定性和低系统资源消 耗&#xff0c;以及对HTTP并发连接的高处理能力&#xff08;单台物理服务器可支持30000~50000个并发请求&#xff09;。正因 为如此&#xff0c;大量提供社交网络、…...

微信小程序canvas画布实现矩形元素自由缩放、移动功能

一、获取画布信息并绘制背景 .whml <canvas class="canvas" type="2d" id="myCanvas" bindtouchstart="get_rect_touch_position" bindtouchmove="move_or_scale" bind:tap="finish_edit_check"/> 定义c…...

一文搞懂 Python 3 中的数据类型

介绍 在 Python 中&#xff0c;与所有编程语言一样&#xff0c;数据类型用于对一种特定类型的数据进行分类。这很重要&#xff0c;因为您使用的特定数据类型将决定您可以为其分配哪些值以及您可以对其执行哪些操作&#xff08;包括可以对其执行哪些操作&#xff09;。 1. 数字…...

学习笔记之——3D Gaussian Splatting源码解读

之前博客对3DGS进行了学习与调研 学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研-CSDN博客文章浏览阅读450次。论文主页3D Gaussian Splatting是最近NeRF方面的突破性工作&#xff0c;它的特点在于重建质量高的情况下还能接入传统光栅化&#xff0c;优…...

Flink standalone集群部署配置

文章目录 简介软件依赖部署方案二、安装1.下载并解压2.ssh免密登录3.修改配置文件3.启动集群4.访问 Web UI 简介 Flink独立模式&#xff08;Standalone&#xff09;是部署 Flink 最基本也是最简单的方式&#xff1a;所需要的所有 Flink 组件&#xff0c; 都只是操作系统上运行…...

Python: + 运算符、append() 方法和 extend()方法的区别和用法

在Python中&#xff0c;有几种常见的方式可以向列表中添加元素&#xff0c;其中包括使用 运算符、append() 方法和 extend() 方法。 使用 运算符&#xff1a; 运算符用于合并两个列表。 通过创建一个新列表&#xff0c;包含两个被合并的列表的元素。不会修改原始列表&…...

【MySQL】mysql集群

文章目录 一、mysql日志错误日志查询日志二进制日志慢查询日志redo log和undo log 二、mysql集群主从复制原理介绍配置命令 读写分离原理介绍配置命令 三、mysql分库分表垂直拆分水平拆分 一、mysql日志 MySQL日志 是记录 MySQL 数据库系统运行过程中不同事件和操作的信息的文件…...

zabbix监控windows主机

下载安装zabbix agent安装包 Zabbix官网下载地址: https://www.zabbix.com/cn/download_agents?version5.0LTS&release5.0.40&osWindows&os_versionAny&hardwareamd64&encryptionOpenSSL&packagingMSI&show_legacy0 这里使用zabbix agent2 安装 …...

单例模式的八种写法、单例和并发的关系

文章目录 1.单例模式的作用2.单例模式的适用场景3.饿汉式静态常量&#xff08;可用&#xff09;静态代码块&#xff08;可用&#xff09; 4.懒汉式线程不安全&#xff08;不可用&#xff09;同步方法&#xff08;线程安全&#xff0c;但不推荐用&#xff09;同步代码块&#xf…...

基于实时Linux+FPGA实现NI CompactRIO系统详解

利用集成的软件工具链&#xff0c;结合信号调理I/O模块&#xff0c;轻松构建和部署实时应用程序。 什么是CompactRIO&#xff1f; CompactRIO系统提供了高处理性能、传感器专用I/O和紧密集成的软件工具&#xff0c;使其成为工业物联网、监测和控制应用的理想之选。实时处理器提…...

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…...

用Linux的视角来理解缓冲区概念

缓冲区的认识 缓冲区&#xff08;buffer&#xff09;是存储数据的临时存储区域。当我们用C语言向文件中写入数据时&#xff0c;数据并不会直接的写到文件中&#xff0c;中途还经过了缓冲区&#xff0c;而我们需要对缓冲区的数据进行刷新&#xff0c;那么数据才算写到文件当中。…...

C#中Enumerable.Range(Int32, Int32) 方法用于计算

目录 一、关于Enumerable.Range(Int32, Int32) 方法 1.定义 2.Enumerable.Range(&#xff09;用于数学计算的操作方法 3.实例1&#xff1a;显示整型数1~9的平方 4.实例2&#xff1a;显示整型数0~9 5.实例3&#xff1a;Enumerable.Range(&#xff09;vs for循环 &#x…...

Linux和windows进程同步与线程同步那些事儿(四):windows 下进程同步

Linux和windows进程同步与线程同步那些事儿&#xff08;一&#xff09; Linux和windows进程同步与线程同步那些事儿&#xff08;二&#xff09;&#xff1a; windows线程同步详解示例 Linux和windows进程同步与线程同步那些事儿&#xff08;三&#xff09;&#xff1a; Linux线…...

1. Logback介绍

Logback介绍 Logback旨在成为流行的log4j项目的继任者。它由Ceki Glc设计&#xff0c;他是log4j的创始人。它基于十年在设计工业级日志系统方 面的经验。结果产品&#xff0c;即logback&#xff0c;比所有现有的日志系统更快&#xff0c;具有更小的占用空间&#xff0c;有时差距…...

SqueezeNet:通过紧凑架构彻底改变深度学习

一、介绍 在深度学习领域&#xff0c;对效率和性能的追求往往会带来创新的架构。SqueezeNet 是神经网络设计的一项突破&#xff0c;体现了这种追求。本文深入研究了 SqueezeNet 的复杂性&#xff0c;探讨其独特的架构、设计背后的基本原理、应用及其对深度学习领域的影响。 在创…...

触控板手势增强:告别跨系统痛点,实现macOS风格三指拖动无缝体验

触控板手势增强&#xff1a;告别跨系统痛点&#xff0c;实现macOS风格三指拖动无缝体验 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/t…...

5分钟部署Qwen3-VL-8B:MacBook也能跑的视觉语言模型,零基础上手

5分钟部署Qwen3-VL-8B&#xff1a;MacBook也能跑的视觉语言模型&#xff0c;零基础上手 1. 为什么选择Qwen3-VL-8B-Instruct-GGUF 1.1 轻量级多模态模型的突破 Qwen3-VL-8B-Instruct-GGUF是阿里通义实验室最新推出的视觉语言模型&#xff0c;它最大的特点就是小身材大能量。…...

Cursor省钱神器:interactive-feedback-mcp安装配置全攻略(附常见问题排查)

Cursor省钱神器&#xff1a;interactive-feedback-mcp安装配置全攻略&#xff08;附常见问题排查&#xff09; 在AI辅助编程领域&#xff0c;Cursor凭借其强大的代码生成和智能补全功能&#xff0c;已成为开发者日常工作的得力助手。然而&#xff0c;许多用户在使用过程中常常…...

提升90%效率:OpenCore EFI自动化配置工具OpCore-Simplify实战指南

提升90%效率&#xff1a;OpenCore EFI自动化配置工具OpCore-Simplify实战指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 副标题&#xff1a;面向…...

Spring Boot项目实战:手把手教你配置Google Play订阅与Pub/Sub回调(含完整代码)

Spring Boot实战&#xff1a;构建高可靠Google Play订阅与Pub/Sub回调系统 在移动应用商业化路径中&#xff0c;应用内订阅已成为数字服务持续变现的核心模式。根据Statista数据&#xff0c;2023年全球应用订阅收入达到380亿美元&#xff0c;其中Google Play贡献了超过34%的份额…...

贾子公理体系全场景应用白皮书——从底层逻辑根服务器到数字政府、金融、AI等十大领域落地

GG3M贾子公理体系&#xff1a;一套底层公理贯通十大全场景应用落地副标题&#xff1a; 贾子公理体系全场景应用白皮书——从底层逻辑根服务器到数字政府、金融、AI等十大领域落地摘要&#xff1a; 贾子公理体系是GG3M项目的底层逻辑根服务器&#xff0c;以自洽可演绎的公理系统…...

告别‘Illegal instruction’:为老旧ARM芯片(如鲲鹏920)定制MongoDB 4.4.9的完整避坑流程

为老旧ARM芯片定制MongoDB 4.4.9的完整避坑指南 当你在国产ARM服务器上部署MongoDB时&#xff0c;是否遇到过Illegal instruction错误&#xff1f;这个问题往往源于硬件与软件版本之间的指令集不匹配。本文将带你深入理解ARM架构的版本差异&#xff0c;并提供一套完整的解决方案…...

告别混乱标注!手把手教你定制LabelImg的标注框颜色与样式(附打包exe完整流程)

视觉标注效率革命&#xff1a;LabelImg高级定制与团队部署实战指南 在计算机视觉项目的标注环节中&#xff0c;混乱的视觉呈现往往成为效率瓶颈。当标注员面对数百张包含"车辆"、"行人"、"交通标志"等多类别的图像时&#xff0c;系统随机分配的标…...

BGE Reranker-v2-m3开发者案例:为LangChain添加本地重排序节点的5步集成法

BGE Reranker-v2-m3开发者案例&#xff1a;为LangChain添加本地重排序节点的5步集成法 1. 项目背景与核心价值 在构建检索增强生成&#xff08;RAG&#xff09;系统时&#xff0c;文本相关性排序是决定最终效果的关键环节。传统的基于向量相似度的检索往往无法准确捕捉查询与…...

【稀缺预警】Python 3.14 JIT编译器深度剖析:3类隐性CPU浪费模式+2套自动降本脚本(附真实AWS账单对比图)

第一章&#xff1a;Python 3.14 JIT编译器的演进逻辑与成本敏感性定位Python 3.14 并非官方发布的正式版本&#xff08;截至2024年&#xff0c;CPython最新稳定版为3.12&#xff0c;3.13处于预发布阶段&#xff09;&#xff0c;但本章以假设性技术前瞻视角&#xff0c;探讨若Py…...