2601,链式调用

原文

2026年第一天完成purecpp社区规划的一项任务--ormpp支持链式调用了!

安全的orm链式调用API用起来与行云流水那样丝滑!

没有串拼装,编译期反射,自动拼装sql脚本,自带编译期检查,安全可靠!
ormpp已支持链式调用了!

简单查询

先根据业务实例创建数据表,然后插入两条数据,以mysql``数据库为例:

cpp 复制代码
struct test_optional {
  int id;
  std::optional<std::string> name;
  std::optional<int> age;
  std::optional<int> empty;
};
dbng<mysql> mysql;
if (mysql.connect(ip, username, password, db)) {
  mysql.create_datatable<test_optional>(ormpp_auto_key{col(&test_optional::id)});
  mysql.insert<test_optional>({0, "purecpp", 1});
  mysql.insert<test_optional>({0, "test", 2});
}

简单查询

cpp 复制代码
//查询所有
auto l = sqlite.select(all).from<test_optional>().collect();
//查询部分列
auto l1 =
    sqlite.select(col(&test_optional::id), col(&test_optional::name))
        .from<test_optional>()
        .collect();
//条件查询
auto l2 = sqlite.select(all)
      .from<test_optional>()
      .where(col(&test_optional::id).in(1, 2))
      .order_by(col(&test_optional::id).desc(),
                col(&test_optional::name).desc())
      .limit(5)
      .offset(0)
      .collect();

绑定参数

cpp 复制代码
//调用`param()`表示它是一个`占位符`'?'`,调用`collect(2)`表示绑定对应的参数
auto l0 = sqlite.select(all)
      .from<test_optional>()
      .where(col(&test_optional::id).param())
      .collect(2);
auto l = sqlite.select(all)
     .from<test_optional>()
     .where(col(&test_optional::name).param())
     .collect(std::string("test"));
CHECK(l0.size() == 1);
CHECK(l.size() == 1);

简单聚集查询

cpp 复制代码
//常见的聚集函数`count,sum,avg,min,max`
auto l = sqlite.select(count()).from<test_optional>().collect();
auto l2 = sqlite.select(count(col(&test_optional::id)))
      .from<test_optional>()
      .collect();
auto l3 = sqlite.select(count_distinct(col(&test_optional::id)))
      .from<test_optional>()
      .collect();
CHECK(l == 2);
CHECK(l2 == 2);
CHECK(l3 == 2);
auto l4 = sqlite.select(sum(col(&test_optional::id)))
      .from<test_optional>()
      .collect();
auto l5 = sqlite.select(avg(col(&test_optional::id)))
      .from<test_optional>()
      .collect();
auto l6 = sqlite.select(min(col(&test_optional::id)))
      .from<test_optional>()
      .collect();
auto l7 = sqlite.select(max(col(&test_optional::id)))
      .from<test_optional>()
      .collect();

聚集加group by查询

cpp 复制代码
//`group_by,having`
auto l =
    sqlite.select(count(col(&test_optional::id)), col(&test_optional::id))
    .from<test_optional>()
    .group_by(col(&test_optional::id))
    .collect();
auto l1 =
sqlite.select(sum(col(&test_optional::id)), col(&test_optional::id))
    .from<test_optional>()
    .group_by(col(&test_optional::id))
    .collect();
auto l2 =
sqlite.select(sum(col(&test_optional::id)), col(&test_optional::id))
    .from<test_optional>()
    .group_by(col(&test_optional::id))
    .collect();
auto l3 =
sqlite.select(sum(col(&test_optional::id)), col(&test_optional::id))
    .from<test_optional>()
    .where(col(&test_optional::id) > 0)
    .group_by(col(&test_optional::id))
    .collect();
auto l4 =
sqlite.select(sum(col(&test_optional::age)), col(&test_optional::id))
    .from<test_optional>()
    .where(col(&test_optional::id) > 0)
    .group_by(col(&test_optional::id))
    .having(sum(col(&test_optional::age)) > 0 && count() > 0)
    .collect();

合并查询

cpp 复制代码
auto l2 = sqlite.select(col(&test_optional::name), col(&person::name))
      .from<test_optional>()
      .inner_join(col(&test_optional::id), col(&person::id))
      .where(col(&person::id) > 0 || col(&person::id) == 1)
      .collect();

链式调用转换下面的比较复杂的sql脚本:

cpp 复制代码
std::string sql =
    "select a.title, a.content, u.user_name as author_name, t.name as "
    "tag_name, a.created_at, a.updated_at, a.views_count, a.comments_count "
    "from articles a INNER JOIN users u ON a.author_id = u.id INNER JOIN "
    "tags t ON a.tag_id = t.tag_id WHERE a.slug =   and a.is_deleted=0;";
auto results =
    conn->select(col(&articles_t::title), col(&articles_t::content),
         col(&users_t::user_name), col(&tags_t::name),
         col(&articles_t::created_at), col(&articles_t::updated_at),
         col(&articles_t::views_count),
         col(&articles_t::comments_count))
    .from<articles_t>()
    .inner_join(col(&articles_t::author_id), col(&users_t::id))
    .inner_join(col(&articles_t::tag_id), col(&tags_t::tag_id))
    .where(col(&articles_t::slug).param() &&
           col(&articles_t::is_deleted) == 0).collect(slug);

至此,无需多言,只有三个词来形容ormpp的链式API:安全,流畅,丝滑!

相关推荐
优雅的潮叭5 小时前
c++ 学习笔记之 chrono库
c++·笔记·学习
星火开发设计5 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
月挽清风5 小时前
代码随想录第七天:
数据结构·c++·算法
点云SLAM7 小时前
C++内存泄漏检测之Windows 专用工具(CRT Debug、Dr.Memory)和Linux 专业工具(ASan 、heaptrack)
linux·c++·windows·asan·dr.memory·c++内存泄漏检测·c++内存管理
浅念-7 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
无限进步_9 小时前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
C+-C资深大佬9 小时前
C++ 数据类型转换是如何实现的?
开发语言·c++·算法
oioihoii10 小时前
回归测试:软件演进中的质量守护神与实践全指南
c++
十五年专注C++开发11 小时前
CMake基础: 在release模式下生成调试信息的方法
linux·c++·windows·cmake·跨平台构建
点云SLAM11 小时前
C++(C++17/20)最佳工厂写法和SLAM应用综合示例
开发语言·c++·设计模式·c++实战·注册工厂模式·c++大工程系统