ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

轻量级orm框架——gzero指南

2022-01-24 10:35:17  阅读:121  来源: 互联网

标签:name orm gzero emp sql id 轻量级


开发过web系统人一定对大量的curd不陌生,为了提高效率我们通常会使用一些orm框架做辅助,而不会直接操作数据库。但是现有的orm框架往往有两个通病(各种语言的都一样):1. API复杂:即使是有经验的开发人员在使用前还是需要先写出原始的SQL语句,再调用api。效率不高,排查问题也不够透明。如果使用原生SQL,通常就需要自己再写代码来处理结果集。2. 使用orm框架对数据库的操作粒度比较粗,有时候为了提高数据库的查询效率,明明一条语句能够完成的工作,通过框架会发送多条语句。这样也无形中增加了系统的负载,降低了系统的并发吞吐量。

所谓我才想能够自己做一个框架,既能够让开发人员自由编写sql,同时又保持了orm的特性,将查询的结果集自动处理成我预先定义好的格式。关键,要使用方便,无外部依赖。经过了大概半个月的尝试,我终于写出了gzero。

一、如何引入

go get gitee.com/learnhow/gzero@v0.8.1

目前的最新版本是v0.8.1,源码只有400行,做了一些简单的单元测试。后面也许会根据大家的反馈意见在这个版本的基础上进一步完善。

二、开始使用

1. 定义模型

复制代码
// 定义员工结构体,内部包含一个身份证信息和登录信息
type Emp struct {
    ID        uint `zero:"primaryKey"`
    Name      string
    JobNumber *string
    ILogin    Login         `zero:"prefix:login_"`
    IdCard    *IdentityCard `zero:"prefix:idcard_"`
}

// 登录信息 
type Login struct {
    ID    uint
    Code  string
    EmpFk uint
}

// 身份证信息
type IdentityCard struct {
    Code string
}
复制代码

既然是orm就应该在我们的结构体内部体现出模型之间的关联关系,gzero通过primaryKey标识主键,在处理结果集的时候会根据主键判断,同时支持复合主键。主键字段不支持指针类型。

2. 创建连接

ctx := Open("mysql", "root:123456@tcp(127.0.0.1:13306)/helloworld?charset=utf8&parseTime=True&loc=Local", Cfg{})

gzero内部调用database/sql,Ctx不是单例对象,你可以反复调用Open方法。但是*sql.DB只会被创建一次,目前我只是做了简单处理。

3. 编写sql并安装进对象

ctx.Sql("SELECT name, job_number FROM t_emp WHERE id = 1").Install(&emp)

gzero默认结构体字段是驼峰类型,映射为表结构的蛇形字段。例如:JobNumber在数据库中对应job_number。你也可以通过“column”重新定义映射的字段名。如果多个结构体都包含同名的字段,你完全可以使用"prefix“为内部的结构体添加统一前缀(这个特点参考了gorm)。

结果示例:

 

 

 三、获取多条结果集

编写sql并安装进Slice

var emps []Emp
ctx.Sql("SELECT id, name FROM t_emp").Install(&emps)

多条结果集需要使用数组或切片来接收,结果示例:

 

 四、根据对象的层次结构处理数据

代码:

var emp []Emp
ctx.Sql("SELECT e.id, e.name, e.job_number, l.emp_fk, l.code AS login_code FROM t_emp e, t_login l WHERE e.id = l.emp_fk").Install(&emp)

查询出来的数据,gzero会根据结构体的层次对数据进行自动处理

 

 五、根据主键自动合并数据

定义结构体:

type Dept struct {
    ID   uint `zero:"primaryKey"`
    Name string
    Emps []Emp `zero:"prefix:emp_"`
}

查询并安装数据:

var depts []Dept
ctx.Sql("SELECT d.id, d.name, e.name AS emp_name, l.code AS login_code FROM t_dept d, t_emp e, t_login l WHERE d.id = e.dept_fk AND l.emp_fk = e.id").Install(&depts)

结构体的前缀能够在sql语句中通过别名指定,查询结果如下:

 

 

 

 

 

 六、总结

目前gzero功能非常简单,就是根据开发人员预先定义好的层次关系将查询的结果集进行处理。之后,我打算增加对象到sql生成的功能,进一步提升crud的开发效率。

 

转 https://www.cnblogs.com/learnhow/p/15834151.html

标签:name,orm,gzero,emp,sql,id,轻量级
来源: https://www.cnblogs.com/wl-blog/p/15838411.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有