1 Star 0 Fork 1

zhoutk / zorm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

zrom    English

介绍

我们通用的ORM,基本模式都是想要脱离数据库的,几乎都在编程语言层面建立模型,由程序去与数据库打交道。虽然脱离了数据库的具体操作,但我们要建立各种模型文档,用代码去写表之间的关系等等操作,让初学者一时如坠云雾。我的想法是,将关系数据库拥有的完善设计工具之优势,来实现数据设计以提供结构信息,让json对象自动映射成为标准的SQL查询语句。只要理解了标准的SQL语言,我们就能够完成数据库查询操作。更进一步,可以使用关系数据库的视图和存储过程来处理表之间的关系,并且在应用层使用一个映射(Zrest - next prj will realize),就可以仅仅使用Zorm和Json来完成所有的数据库操作。

相关项目

本项目依赖 本人的 另一个项目 Zjson,此项目提供简洁、方便、高效的Json库。该库使用方便,是一个单文件库,只需要下载并引入项目即可。具体信息请移步 gitee-Zjsongithub-Zjson

项目名称说明

本人姓名拼音第一个字母z加上orm,即得本项目名称zorm,没有其它任何意义。我将编写一系列以z开头的相关项目,命名是个很麻烦的事,因此采用了这种简单粗暴的方式。

设计思路

ZORM 数据传递采用json来实现,使数据标准能从最前端到最后端达到和谐统一。此项目目标,不但在要C++中使用,还要作为动态链接库与node.js结合用使用,因此希望能像javascript一样,简洁方便的操作json。所以先行建立了zjson库,作为此项目的先行项目。设计了数据库通用操作接口,实现与底层实现数据库的分离。该接口提供了CURD标准访问,以及批量插入和事务操作,基本能满足平时百分之九十以上的数据库操作。项目基本目标,支持Sqlite3,Mysql,Postges,达梦8 四种关系数据库,同时支持windows、linux和macOS。

项目特点

本系列项目采用单头文件形式开发,使用简单,需要什么,你只要把它下载到你的项目中,include进你的代码,直接使用就好。

项目进度

现在已经实现了基本目标的所有功能。
我选择的技术实现方式,基本上是最底层高效的方式。sqlit3 - sqllit3.h(官方的标准c接口);mysql - c api (MySQL Connector C 6.1);达梦8 - dpi;postgres - c api(pgsql14);pqxx分支实现了libpqxx7.7.4的封装,linux和macos上运行正常,windows上运行有问题,待解决。

任务列表:

  • Sqlite3 实现
    • linux
    • windows
    • macos
  • Mysql 实现
    • linux
    • windows
    • macos
  • Postgre 实现
    • linux
    • windows
    • macos
  • Dm8 实现
    • linux
    • windows
    • macos

数据库通用接口

应用类直接操作这个通用接口,实现与底层实现数据库的分离。该接口提供了CURD标准访问,以及批量插入和事务操作,基本能满足平时百分之九十以上的数据库操作。

  class ZORM_API Idb
  {
  public:
      virtual Json select(const string& tablename, const Json& params, vector<string> fields = vector<string>(), Json values = Json(JsonType::Array)) = 0;
      virtual Json create(const string& tablename, const Json& params) = 0;
      virtual Json update(const string& tablename, const Json& params) = 0;
      virtual Json remove(const string& tablename, const Json& params) = 0;
      virtual Json querySql(const string& sql, Json params = Json(), Json values = Json(JsonType::Array), vector<string> fields = vector<string>()) = 0;
      virtual Json execSql(const string& sql, Json params = Json(), Json values = Json(JsonType::Array)) = 0;
      virtual Json insertBatch(const string& tablename, const Json& elements, string constraint = "id") = 0;
      virtual Json transGo(const Json& sqls, bool isAsync = false) = 0;
  };

实例构造

全局查询开关变量:

  • DbLogClose : sql 查询语句显示开关
  • parameterized : 是否使用参数化查询

Sqlite3:

    Json options;
    options.add("connString", "./db.db");    //数据库位置
    options.add("DbLogClose", false);        //显示查询语句
    options.add("parameterized", false);     //不使用参数化查询
    DbBase* db = new DbBase("sqlite3", options);

Mysql:

    Json options;
    options.add("db_host", "192.168.6.6");   //mysql服务IP
    options.add("db_port", 3306);            //端口
    options.add("db_name", "dbtest");        //数据库名称
    options.add("db_user", "root");          //登记用户名
    options.add("db_pass", "123456");        //密码
    options.add("db_char", "utf8mb4");       //连接字符设定[可选]
    options.add("db_conn", 5);               //连接池配置[可选],默认为2
    options.add("DbLogClose", true);         //不显示查询语句
    options.add("parameterized", true);      //使用参数化查询
    DbBase* db = new DbBase("mysql", options);

Postgres:

    Json options;
    options.add("db_host", "192.168.6.6");
    options.add("db_port", 5432);
    options.add("db_name", "dbtest");
    options.add("db_user", "root");
    options.add("db_pass", "123456");
    options.add("db_conn", 5);
    options.add("DbLogClose", false);
    options.add("parameterized", true);
    DbBase* db = new DbBase("postgres", options);

智能查询方式设计

查询保留字:page, size, sort, fuzzy, lks, ins, ors, count, sum, group

  • page, size, sort, 分页排序 在sqlit3与mysql中这比较好实现,limit来分页是很方便的,排序只需将参数直接拼接到order by后就好了。
    查询示例:

    Json p;
    p.add("page", 1);
    p.add("size", 10);
    p.add("size", "sort desc");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  ORDER BY age desc LIMIT 0,10
  • fuzzy, 模糊查询切换参数,不提供时为精确匹配 提供字段查询的精确匹配与模糊匹配的切换。

    Json p;
    p.add("username", "john");
    p.add("password", "123");
    p.add("fuzzy", 1);
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  WHERE username like '%john%'  and password like '%123%'
  • ins, lks, ors 这是最重要的三种查询方式,如何找出它们之间的共同点,减少冗余代码是关键。

    • ins, 数据库表单字段in查询,一字段对多个值,例:
      查询示例:
    Json p;
    p.add("ins", "age,11,22,36");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  WHERE age in ( 11,22,26 )
    • ors, 数据库表多字段精确查询,or连接,多个字段对多个值,例:
      查询示例:
    Json p;
    p.add("ors", "age,11,age,36");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  WHERE  ( age = 11  or age = 26 )
    • lks, 数据库表多字段模糊查询,or连接,多个字段对多个值,例: 查询示例:
    Json p;
    p.add("lks", "username,john,password,123");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  WHERE  ( username like '%john%'  or password like '%123%'  )
  • count, sum 这两个统计求和,处理方式也类似,查询时一般要配合group与fields使用。

    • count, 数据库查询函数count,行统计,例: 查询示例:
    Json p;
    p.add("count", "1,total");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT *,count(1) as total  FROM users
    • sum, 数据库查询函数sum,字段求和,例: 查询示例:
    Json p;
    p.add("sum", "age,ageSum");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT username,sum(age) as ageSum  FROM users
  • group, 数据库分组函数group,例:
    查询示例:

    Json p;
    p.add("group", "age");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  GROUP BY age

不等操作符查询支持

支持的不等操作符有:>, >=, <, <=, <>, =;逗号符为分隔符,一个字段支持一或二个操作。
特殊处:使用"="可以使某个字段跳过search影响,让模糊匹配与精确匹配同时出现在一个查询语句中

  • 一个字段一个操作,示例: 查询示例:
    Json p;
    p.add("age", ">,10");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  WHERE age> 10
  • 一个字段二个操作,示例: 查询示例:
    Json p;
    p.add("age", ">=,10,<=,33");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  WHERE age>= 10 and age<= 33
  • 使用"="去除字段的fuzzy影响,示例: 查询示例:
    Json p;
    p.add("age", "=,18");
    p.add("username", "john");
    p.add("fuzzy", "1");
    (new DbBase(...))->select("users", p);
    
    生成sql:   SELECT * FROM users  WHERE age= 18  and username like '%john%'

具体使用方法,请参看uint test。

单元测试

有完整功能的单元测试用例,请参见tests目录下的测试用例。

测试用例运行结果样例 输入图片说明

项目地址

https://gitee.com/zhoutk/zorm

https://github.com/zhoutk/zorm

运行方法

该项目在vs2022, gcc12.12.0(最低gcc8.5.0), clang12.0下均编译运行正常。

git clone https://github.com/zhoutk/zorm
cd zorm
cmake -Bbuild .

---windows
cd build && cmake --build .

---linux & macos
cd build && make

run zorm or ctest
  • 注1:在linux下需要先行安装mysql开发库, 并先手动建立数据库 dbtest。
    在ubuntu下的命令是: apt install libmysqlclient-dev
  • 注2:在linux下需要先行安装 libpq 开发库(要求gcc版本高于8)。
    在ubuntu下的命令是: apt-get install libpq-dev
  • 注3:在macos下需要先行安装 postgresql@14 开发库。
    命令是: brew install postgresql@14
  • 注4:在windows下,若想使用pqxx分支,需编译libpqxx7.7.4,命令如下: cmake -A x64 -DBUILD_SHARED_LIBS=on -DSKIP_BUILD_TEST=on -DPostgreSQL_ROOT=/d/softs/pgsql .. cmake --build . --config Release cmake --install . --prefix /d/softs/libpqxx
  • 注5:在windows下,postgres10是支持win32的最后一个版本,我先择只支行64位版本,选择了最高版本。
  • 注6:关于pqxx分支,在windows下, postgres 只能链接 libpqxx7.7.4 的 debug 版, 运行时会出错, Expression:__acrt_first_block==header, 我正在努力解决 ...

相关项目

会有一系列项目出炉,网络服务相关,敬请期待...

gitee-Zjson github-Zjson

MIT License Copyright (c) 2022 zhoutk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

A orm for db using c++ and zjson. 展开 收起
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/zhoutk/zorm.git
git@gitee.com:zhoutk/zorm.git
zhoutk
zorm
zorm
master

搜索帮助