首页 > 数据库 >C++ SQL ORM

C++ SQL ORM

时间:2024-08-07 21:52:56浏览次数:14  
标签:std info partial cout auto C++ ORM SQL class

 测试代码 

//
// 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


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

标签:std,info,partial,cout,auto,C++,ORM,SQL,class
From: https://blog.csdn.net/qq_30220519/article/details/141002076

相关文章

  • C++入门基础(完整版)含下卷
    C++入门基础hello各位未来的程序员大佬们,这一篇是详细介绍入门基础,和上一篇不同的是这一篇补完了引用的知识和inline,nullptr的知识,希望大家有所收获namespace的价值在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中......
  • sql注入一些学习笔记
    以下内容主要是作为自己学习笔记记录使用,可能会有错误,欢迎指正,所有内容仅供参考,部分名词内容解释来自其他博主或chatgpt,如有侵权,联系删除一些基础的表information_schema.schemataschemata_name其实就是databasesCatalog_name每个Catalog包含多个Schema,每个Schema包含......
  • C++ STL与string类
    一什么是STL?STL,全称是标准模板库(StandardTemplateLibrary),是C++标准库的一部分。STL提供了一些常用的数据结构和算法,帮助开发者更方便、高效地编写代码。通过使用STL,开发者不需要重复造轮子,可以直接使用已经优化好的组件,提高了代码的可读性和可维护性。二STL的六大组件1.......
  • sqli-labs-master 25-30关
    sqli-labs第25关由本题意可得过滤and和or,我用双写进行绕过,例如:infoorrmation,aandnd数据库名http://127.0.0.1/sqli-labs-master/Less-25/?id=-1%27%20union%20select%201,2,database()--+表名127.0.0.1/sqli-labs-master/Less-25/?id=-1'unionselect1,2,group_conca......
  • node.js: mysql con in vscode
    mysqlscript:droptable`vuedustu`;CREATETABLE`vuedustu`(`stuId`int(11)NOTNULLAUTO_INCREMENTcomment'学生编号',`stuname`varchar(255)DEFAULTNULLcomment'学姓姓名',`stusex`varchar(255)DEFAULTNULLcomment'性别',......
  • VS设置 LLVM-Clang 编译器进行编译C++项目
    在VS中默认的C++编译器一般为MSVC编译器,可以根据自己的需要将其设置为LLVM-Clang编译器。主要有两种方案:1)直接使用VisualStudioInstaller来自动下载对应的Clang编译器和构建工具,后续无需再进行配置,便可直接使用。2)使用自己编译或者单独下载的LLVM-Clang编译器,以及通......
  • [Mysql]为什么性别不适合加索引
    大家都知道索引分聚集索引和非聚集索引,性别字段因为可重复肯定只能建立非聚集索引,然而因为非聚集索引叶子节点存储的是索引值和聚集索引值,需要回表。所以在性别这种辨别度较低的字段上建立索引,索引树可能只有两个节点,跟线性查找没有太大区别,并且因为回表的存在导致在聚集索引树和......
  • 使用dapper,因错误SQL字串拼接方式 导致的内存泄漏
    作者就职的公司在19年就开始使用.netcore并且部署到Linux上,这些年也遇到不少问题,有些问题都是使用土方法去解决,后面再慢慢写吧,准备将遇到的问题写成一个系列。 前情提要本次的项目是20年上线的储值卡系统,上线后发现内存缓慢增长(半个月涨到4G多),一直没有找到原因就让运维小伙伴......
  • web页面中直接调用c++/c/go代码?【wasm】
    背景最近在做rosbag的可视化工具,网上找了个源码参考(foxglove)。成功down下来,跑起来了。于是乎,开始研究前后端代码;结果居然花了一下午没找到后端代码,不明白为什么纯web页面就可以解析rosbag(以前都是用node.js或者c++代码解析的)。过程在找了一下午之后,又回到了老办法;看netork,果然......
  • SqlServer 主从复制错误分析--20598
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、在分发服务器执行如下脚本select*fromMSsubscriber_infoselect*fromMSpublications 2、选择分发数据库-distribution,执行如下脚本 sp_helpsubscriptionerrors'IZQY9C2TQSKGS9ZTEST','DBTEST','DbPiblish'......