前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >向Gorm大声说拜拜,Aorm你值得拥有

向Gorm大声说拜拜,Aorm你值得拥有

原创
作者头像
程序员汤汤
发布2022-12-08 09:21:56
4600
发布2022-12-08 09:21:56
举报
文章被收录于专栏:汤哥搞开发汤哥搞开发
template.jpg
template.jpg

熟悉GO开发的朋友们应该都知道,在GO的web开发领域,gorm的使用非常广泛,但是我使用很长时间后,终于下决心要把它换掉。

为什么换掉Gorm

无法更新空值,比如数字0,空字符串,布尔值空。

当然这里并不是说一定不行,只是不做特殊处理的情况下不行。比如你把strut转成map,就可以了。或者直接使用map。

动态条件拼接太麻烦。

前端做筛选的时候,传过来的参数有哪些不一定,数量有多少也不一定。这种情况下如果你的SQL语句是提前写死的,那肯定是不能满足需求的。另外如果参数一大堆,那么写占位符?的数量是不是写正确了,也是个大问题。

写sql也是一件麻烦事。

我们希望只输入必要的参数,程序就能给我返回相应的数据。谁也不想天天去写sql,又要注意语法,又要注意拼写。

用Aorm来代替

花了将近2周的时间,我开发出了一个新的orm,姑且认为它是吧,算是解决了上面的问题。现在已经开源,文档也已经准备好,地址如下

https://github.com/tangpanqing/aorm

基本特性如下

  •  简易并且快速
  •  支持 MySQL 数据库
  •  支持空值查询和写入
  •  支持自动迁移表结构
  •  支持动态生成Sql

有兴趣的朋友,可以移步上面的链接看详情,如果能够帮助到你,希望能给个星星。

下面,我们给出几个例子。

利用Aorm实现空值写入

假设我们现在已经定义了Person结构

代码语言:go
复制
    type Person struct {
        Id         aorm.Int    `aorm:"primary;auto_increment" json:"id"`
        Name       aorm.String `aorm:"size:100;not null;comment:名字" json:"name"`
        Sex        aorm.Bool   `aorm:"index;comment:性别" json:"sex"`
        Age        aorm.Int    `aorm:"index;comment:年龄" json:"age"`
        Type       aorm.Int    `aorm:"index;comment:类型" json:"type"`
        CreateTime aorm.Time   `aorm:"comment:创建时间" json:"createTime"`
        Money      aorm.Float  `aorm:"comment:金额" json:"money"`
        Test       aorm.Float  `aorm:"type:double;comment:测试" json:"test"`
    }

你只需要执行如下代码,即可写入数据库

代码语言:go
复制
    id, errInsert := aorm.Use(db).Debug(true).Insert(&Person{
        Name:       aorm.StringFrom("Alice"),
        Sex:        aorm.BoolFrom(false),
        Age:        aorm.IntFrom(18),
        Type:       aorm.IntFrom(0),
        CreateTime: aorm.TimeFrom(time.Now()),
        Money:      aorm.FloatFrom(100.15987654321),
        Test:       aorm.FloatFrom(200.15987654321987654321),
    })
    if errInsert != nil {
        fmt.Println(errInsert)
    }
    fmt.Println(id)

它实际执行的sql如下

代码语言:sql
复制
    INSERT INTO person (name,sex,age,type,create_time,money,test) VALUES (?,?,?,?,?,?,?)
    Alice false 18 0 2022-12-07 10:10:26.1450773 +0800 CST m=+0.031808801 100.15987654321 200.15987654321987

注意哦,type对应的值是0,正确写入, sex的值是false,也正确写入

利用Aorm实现条件动态拼接

假设我们要从多个维度来查询person,但是究竟多少个是未知的,可以使用下面的方法。

无论多少个查询条件,直接往WhereArr里添加即可

代码语言:go
复制
    var listByWhere []Person
    
    var where1 []aorm.WhereItem
    where1 = append(where1, aorm.WhereItem{Field: "type", Opt: aorm.Eq, Val: 0})
    where1 = append(where1, aorm.WhereItem{Field: "age", Opt: aorm.In, Val: []int{18, 20}})
    where1 = append(where1, aorm.WhereItem{Field: "money", Opt: aorm.Between, Val: []float64{100.1, 200.9}})
    where1 = append(where1, aorm.WhereItem{Field: "money", Opt: aorm.Eq, Val: 100.15})
    where1 = append(where1, aorm.WhereItem{Field: "name", Opt: aorm.Like, Val: []string{"%", "li", "%"}})
    
    aorm.Use(db).Debug(true).Table("person").WhereArr(where1).GetMany(&listByWhere)
    for i := 0; i < len(listByWhere); i++ {
        fmt.Println(listByWhere[i])
    }

它产生的sql如下

代码语言:go
复制
    SELECT * FROM person WHERE type = ? AND age IN (?,?) AND money BETWEEN (?) AND (?) AND CONCAT(money,'') = ? AND name LIKE concat('%',?,'%')
    0 18 20 100.1 200.9 100.15 li

究竟有多少个问号,他们都在哪里,你根本不需要关心,也无需关心

更多体验

怎么样,还可以吧? 如果有兴趣,在你的go项目里,使用如下命令,即刻体验

代码语言:shell
复制
    go get -u github.com/tangpanqing/aorm

最后再发一次项目和文档地址

https://github.com/tangpanqing/aorm

如果能够帮助到你,记得给我点个星星哦。。。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么换掉Gorm
    • 无法更新空值,比如数字0,空字符串,布尔值空。
      • 动态条件拼接太麻烦。
        • 写sql也是一件麻烦事。
        • 用Aorm来代替
          • 利用Aorm实现空值写入
            • 利用Aorm实现条件动态拼接
            • 更多体验
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档