C++ SQL ORM

news2024/9/22 23:33:31

 测试代码 

//
// Created by www on 2024/8/7.
//
#include "sqlitepp/database.h"
#include "sqlitepp/condition.h"

#include <iostream>
using namespace sqlitepp;
using namespace sqlitepp::literals;

enum class test_enum {
  hello
};

void testCondition() {

  std::string s;
  {
    // ==
    auto q = "t"_c == test_enum::hello;
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
    std::holds_alternative<orm::db_integer_type>(p.params[0]);
  }

  {
    // !=
    auto q = "t"_c != test_enum::hello;
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  {
    // NOT
    auto q = !("t"_c == "hello");
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  {
    // is NULL
    auto q = "t"_c == nullptr;
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  {
    // is NOT NULL
    auto q = "t"_c != nullptr;
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  {
    // AND
    auto q = "t"_c == "hello" && "t2"_c == "test";
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  {
    // OR
    auto q = "t"_c == "hello" || "t2"_c == "test";
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  { // BETWEEN
    auto q = "t"_c.between(static_cast<int64_t>(10),static_cast<int64_t>(20));
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  { // NOT BETWEEN
    auto q = "t"_c.not_between(static_cast<int64_t>(10),static_cast<int64_t>(20));
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  {
    // LIKE
    auto q = "t"_c.like("test%");
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  {
    // GLOB
    auto q = "t"_c.glob("test%");
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  { // >
    auto q = "t"_c > static_cast<int64_t>(10);
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  { // >
    auto q = "t"_c >= static_cast<int64_t>(10);
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  { // >
    auto q = "t"_c < static_cast<int64_t>(10);
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }

  { // >
    auto q = "t"_c <= static_cast<int64_t>(10);
    auto p = q.as_partial();
    std::cout << p.query << std::endl;
  }
}



#include "include/sqlitepp/database.h"
#include "include/sqlitepp/orm.h"

using namespace sqlitepp;
using namespace sqlitepp::orm;

struct my_entity : orm::entity {
  enum class e_test {
    hello = 10,
    hello2 = 20
  };
  e_test t {e_test::hello};
  std::optional<int64_t> test_optional {};

  using entity::entity;

  static const orm::class_info _class_info;
  const orm::class_info& get_class_info() const noexcept override { return _class_info; }
};

const orm::class_info my_entity::_class_info = orm::builder<my_entity>("e")
                                                   .field("t", &my_entity::t)
                                                   .field("test_optional", &my_entity::test_optional)
                                                   .build();

void testORM() {

   {  // ReadWriteEnum
    database db;
    my_entity e(db);
    auto& info = e.get_class_info();
    auto* field = info.get_field_by_name("t");

    auto val = field->getter(&e);
    std::cout << std::get<db_integer_type>(val) << std::endl;
    e.t = my_entity::e_test::hello2;
    val = field->getter(&e);
    std::cout << std::get<db_integer_type>(val) << std::endl;
    val = db_integer_type{10};
    field->setter(&e, val);
    std::cout << (int)e.t << std::endl;
  }

  { // ReadWriteOptional
    database db;
    my_entity e(db);
    auto& info = e.get_class_info();
    auto* field = info.get_field_by_name("test_optional");

    auto val = field->getter(&e);
    e.test_optional = 100;
    val = field->getter(&e);
    std::cout << std::get<db_integer_type>(val) << std::endl;

    val = db_integer_type{10};
    field->setter(&e, val);
    std::cout << e.test_optional.value() << std::endl;

    val = db_null_type{};
    field->setter(&e, val);
    std::cout << e.test_optional.has_value() << std::endl;
  }

  { // IsModified
    database db;
    my_entity e(db);
    auto& info = e.get_class_info();
    db.exec(generate_create_table(info));

    std::cout << (e.is_modified()) << std::endl;
    e.save();
    std::cout << (e.is_modified()) << std::endl;
    e.test_optional = 1337;
    std::cout << (e.is_modified()) << std::endl;
    e.save();
    std::cout << (e.is_modified()) << std::endl;

    e.test_optional.reset();
    std::cout << (e.is_modified()) << std::endl;
    e.reset();
    std::cout << (e.is_modified()) << std::endl;
    std::cout << e.test_optional.value() << std::endl;
  }

}

int main() {
  database db;
  testCondition();
  testORM();
  return 0;
}
输出
`t` = ?
`t` <> ?
 NOT (`t` = ?)
`t` IS NULL
`t` IS NOT NULL
(`t` = ?) AND (`t2` = ?)
(`t` = ?) OR (`t2` = ?)
`t` BETWEEN ? AND ?
`t` NOT BETWEEN ? AND ?
`t` LIKE ?
`t` GLOB ?
`t` > ?
`t` >= ?
`t` < ?
`t` <= ?
10
20
10
100
10
0
1
0
1
0
1
0
1337
参考

https://github.com/Thalhammer/sqlitepp

我去年买了个表/sqlite3


创作不易,小小的支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matplotlib | 绘制折线图

目录 简介安装 Matplotlib开始绘制简单折线图改变线的样式改变节点的样式添加图表文字改变坐标轴标签改变坐标数值范围绘制多条折线实践&#xff1a;绘制温度变化图 简介 折线图&#xff08;Line Chart&#xff09;&#xff0c;是一种以折线来呈现数据随时间变化而变化的图表。…

上翘机头设计确保了机器人在与杆子正面碰撞后,平稳从水平飞行状态重新调整为垂直飞行状态,进而用翅膀紧紧抱住杆子,实现稳定的栖息

带翼无人驾驶飞行器&#xff08;UAV&#xff09;因其出色的单位质量续航能力&#xff0c;特别适用于远距离任务&#xff0c;如送货、测绘和搜索救援。然而&#xff0c;与有翼飞行动物相比&#xff0c;它们在复杂结构上的着陆或栖息能力受限&#xff0c;难以执行检查、操作、监控…

for循环中的setTimeout的几种情况

for循环中的setTimeout的几种情况 在做js相关的题目时&#xff0c;经常会遇到以下几种容易混淆的setTimeout相关的题目&#xff1a; 第一种 for(var i0;i<10;i){setTimeout(console.log(i),0); }在这个代码片段中&#xff0c;setTimeout 的第一个参数是 console.log(i)&…

Qt QTableWidget 去除序号列

ui->tableWidget->verticalHeader()->setHidden(true);//垂直序列号&#xff08;表左侧&#xff09;ui.tableWidget->horizontalHeader()->setHidden(true);//水平序列号&#xff08;表上方&#xff09;删除后效果图&#xff1a;

Aurora64B 66B IP的原理及示例工程分析(高速收发器二十四)

点击进入高速收发器系列文章导航界面 1、Aurora 64B/66B原理 Aurora 64B/66B的原理与Aurora 8B/10B的原理基本上一致&#xff0c;通道概述如下所示。 图1 Aurora 64B/66B概述 上图的Aurora 64B/66B Core就是该IP&#xff0c;一个IP可以驱动多个高速收发器&#xff0c;该内核的主…

虚拟机(VMware16)安装rocky9.2详细过程,附镜像下载链接

rocky官方站点 链接: 官方站点 rocky9.2镜像下载路径 链接: Rocky-x86_64-dvd.iso 打开虚拟机&#xff0c;选择新建虚拟机 新建虚拟机 选择典型 由于VMware16没有rocky的版本&#xff0c;所以我们这里选择其他liunx 5.x 内核 64位 因为rocky9默认内核版本就是5开头的&#xf…

高频焊机逆变电路谐波计算及分析

一、SPWM谐波分析 简化高频焊机逆变模块为图4-6的单相PWM逆变电路。它由一个大小为u0的直流电压源和两个桥臂组成&#xff0c;每个桥臂包括两个MOSFET全控器件&#xff0c;阻抗Z模块为逆变输出负载[26]。逆变控制器的控制算法为双极性SPWM算法&#xff0c;即通过正弦调制波和三…

Unity Addressables bundle依赖查看和资源重复查看工具

在开发的过程有时候想要知道addressables 打包出来bundles的依赖关系&#xff0c;以及资源的重复情况。直接通过自带的addressables工具查看有点困难。这里分享一个github上的开源工具。名称为UnityAddressablesBuildLayoutExplorer。该工具可以帮助查看所有文件的依赖情况&…

在Visual Studio/Qt Creator 中使用CMake安装和使用vcpkg包

文章目录 0. vcpkg简介和安装0.1 vcpkg简介0.2 vcpkg安装0.2.1 如何在Visual Studio 2022以及以上版本中安装vcpkg0.2.2 在其他VS版本或Qt Creator等平台上中安装vcpkg 1. 在Visual Studio 中使用CMake安装和使用vcpkg包1.1 创建Visual Studio项目1.2 设置项目文件a. 配置CMake…

线性方程组迭代算法的Python实现

更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xff1a; ABAQUS数值模拟相关Python科学计算开源框架&#xff0c;编程…

pip 安装 scikit-learn

第一步&#xff1a;更新pip 可以首先执行 python -m ensurepip 然后执行 python -m pip install --upgrade pip 即可更新完毕。 python -m ensurepip python -m pip install --upgrade pip第二步 安装sklearn的时候一定要注意顺序。 安装顺序&#xff1a;numpy / scipy / ma…

汇编语言入门基础(访问寄存器和内存)

目录 访问寄存器和内存 2.1 寄存器是CPU内部的信息存储单元 2.1.1 通用寄存器--以AX为例 2.1.2 将AX分成AH与AL 2.2 “字”再寄存器中的存储 2.3 mov和add指令 2.3.1 练习1 2.3.2 练习2 2.4 确定物理地址的方法 2.4.1 物理地址 2.4.2 8086CPU给出物理地址的方法 2.4.…

swin和vit

参考&#xff1a;https://blog.csdn.net/weixin_44878336/article/details/125444556 Swin Transformer与Vision Transformer的对比 二者的不同之处&#xff1a; Swin-Transformer所构建的特征图是具有层次性的&#xff0c;很像我们之前将的卷积神经网络那样&#xff0c;随着…

基于检索增强生成 (RAG) 的大语言模型优化研究

复旦大学的研究人员对检索增强生成技术 (RAG) 的现有方法进行了系统性的研究&#xff0c;提出了一种三步式方法来优化 RAG 框架&#xff0c;并通过实验证明了该方法在提高大型语言模型性能方面的有效性&#xff0c;特别是在多模态检索和问答方面的应用。 论文介绍 基于检索的…

HexView 刷写文件脚本处理工具-基本功能介绍(二)-导入文件

菜单 保存(Save) 在对数据进行任何修改后(例如修改十六进制行或块的基地址),保存选项将被启用。这表示文件已被修改。在这种情况下,“保存”选项允许你将数据存储到当前文件名中。Hexview会以当前文件格式写入数据。当前文件格式显示在状态行中。 另存为(Save as) 允…

LVS详细介绍及常见模式(NAT,DR,防火墙标记)实验详解

目录 一、什么是LVS 二、LVS的核心思想 三、 LVS的优势 四、LVS的调度算法 4.1. LVS的调度算法类型 4.2. LVS静态调度算法 4.3. LVS动态调度算法 4.4.在4.15版本内核以后新增调度算法 五、LVS软件相关信息 六、ipvsadm命令 七、 LVS的NAT模式实验详解 7.1实验环境 7.…

“DS18B20,感知每一度细微变化,记录每一刻温暖。”#DS18B20温度传感器

“DS18B20&#xff0c;感知每一度细微变化&#xff0c;记录每一刻温暖。”#DS18B20温度传感器 前言预备知识1.DS18B20核心参数2.DS18B20初始化函数代码编写2.1分析DS18B20初始化时序图2.2依据时序图编写相应代码 3.向DS18B20写入一个字节函数代码编写3.1分析DS18B20写时序图3.2…

Zoho工作邮箱支持哪些功能?

工作域名邮箱都有哪些常见功能呢&#xff1f;一、消息流 &#xff1b;二、邮件委托给同事代为处理&#xff1b;三、附件查看器 &#xff1b;四、在邮箱里直接和同事音频/视频通话等八大功能。 一、消息流 - 邮箱里的社交渠道 Zoho Mail等专业工作邮箱平台引入了消息流功能&…

免账户免权限免费获取 A股 全市场股票ETF指数 分钟级数据

日期 2024/8/2 意外发现的&#xff0c;抛砖引玉&#xff0c;测试了下&#xff0c;其他券商的也可以。 可以直接获取 1m 5m 1day 级别的数据&#xff0c;全A股市场的都可以。期货未测试。 需要 其他的级别的分数数据可以自行合成。 原理 券商版qmt获取行情数据时&#xff0c;不…

JavaSE之常用API(后篇)

接上篇 五、Random 5.1 使用 5.2 练习 六、包装类 6.1 是什么 包装类:封装了基本类的一些操作,更加方便使用 为了对象的完整性,更重要的是配合泛型一起使用 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character 八种包装…