Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Aorm又进步了,目前已支持MySQL,MSSQL,Postgres,Sqlite3,并且支持子查询

Aorm又进步了,目前已支持MySQL,MSSQL,Postgres,Sqlite3,并且支持子查询

原创
作者头像
程序员汤汤
发布于 2022-12-26 08:57:55
发布于 2022-12-26 08:57:55
9990
举报
文章被收录于专栏:汤哥搞开发汤哥搞开发

hi,各位golang的朋友,我很高兴的告诉你们,Aorm又进步了。

微信图片_20221226163624.png
微信图片_20221226163624.png

Aorm是什么

Aorm是一个基于go语言的数据库操作库,可以帮助你更方便的进行数据库操作。

它最大的特点是支持空值查询和更新,以及支持sql的链式操作,特别类似于php相关的orm操作

这里是之前发过的一个文档

想早点下班?试试Aorm库吧,更方便的进行Go数据库操作 - 掘金 (juejin.cn)

这是具体的项目地址

tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)

在最近的一个星期左右,我将它进行了升级。

之前只支持MySQL,目前已经支持MySQL, MSSQL, Postgres, Sqlite3等四大数据

之前不支持子查询,目前已经支持

示例

一般情况下的写入

如果你使用MySQL,Sqlite3 数据库,可以直接使用如下的代码,来进行一次插入

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

它产生的sql如下

代码语言:txt
AI代码解释
复制
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.15 200.15987654321987
MSSQL与Postgres的特殊性

如果你使用MSSQL,Postgres 数据库,需要增加一个Driver操作,以明确的告诉Aorm,这里是MSSQL或者Postgres,Aorm会对sql做一些修改,例如

代码语言:go
AI代码解释
复制
id, errInsert := aorm.Use(db).Debug(true).Driver("mssql").Insert(&Person{
    ....
})

它产生的sql如下

代码语言:txt
AI代码解释
复制
INSERT INTO person (name,sex,age,type,create_time,money,test) VALUES (?,?,?,?,?,?,?); select ID = convert(bigint, SCOPE_IDENTITY())
Alice false 18 0 2022-12-07 10:10:26.1450773 +0800 CST m=+0.031808801 100.15 200.15987654321987

你可能已经注意到,生成的sql里,加上了

代码语言:txt
AI代码解释
复制
select ID = convert(bigint, SCOPE_IDENTITY())

这是因为mssql默认情况下,并不会返回最后插入的记录id,只有加上这一句sql,进行一次查询才能得到

另外Postgres也有类似的情况,只不过它加的sql代码是

代码语言:txt
AI代码解释
复制
returning id

支持子查询

子查询是非常重要的功能,可以极大的方便查询,目前aorm已经可以支持

将子查询用在字段上

代码语言:go
AI代码解释
复制
var listByFiled []PersonWithArticleCount

sub := aorm.Sub().Table("article").SelectCount("id", "article_count_tem").WhereRaw("person_id", "=person.id")

err := aorm.Use(db).Debug(false).
   Driver(driver).
   SelectExp(&sub, "article_count").
   Select("*").
   Where(&Person{Age: null.IntFrom(18)}).
   GetMany(&listByFiled)

if err != nil {
   panic(driver + " testSelectWithSub " + "found err:" + err.Error())
}

你可能已经注意到

代码语言:go
AI代码解释
复制
sub := aorm.Sub().Table("article").SelectCount("id", "article_count_tem").WhereRaw("person_id", "=person.id")

这里定义了一个子查询,它此时并没有查询数据库哦,然后将他作为参数使用

代码语言:go
AI代码解释
复制
   SelectExp(&sub, "article_count").

意思很明显,上述子查询的结果,将被重命名一个新的字段 article_count,最终生成的sql为

代码语言:sql
AI代码解释
复制
SELECT *,(SELECT count(id) AS article_count_tem FROM article WHERE person_id=person.id) AS article_count FROM person WHERE age = ?
18

将子查询用在查询条件上

代码语言:go
AI代码解释
复制
var listByFiled []Person

sub := aorm.Sub().Table("article").Select("person_id").GroupBy("person_id").HavingGt("count(person_id)", 0)

err := aorm.Use(db).Debug(false).
   Table("person").
   Driver(driver).
   WhereIn("id", &sub).
   GetMany(&listByFiled)

if err != nil {
   panic(driver + " testWhereWithSub " + "found err:" + err.Error())
}

如你所见

代码语言:go
AI代码解释
复制
sub := aorm.Sub().Table("article").Select("person_id").GroupBy("person_id").HavingGt("count(person_id)", 0)

这里定义了一个子查询,它在如下的代码块被使用

代码语言:go
AI代码解释
复制
   WhereIn("id", &sub).

意思很明显,上述子查询的结果,将被用作where的一个条件,它产生的sql如下

代码语言:sql
AI代码解释
复制
SELECT * FROM person WHERE id IN (SELECT person_id FROM article GROUP BY person_id Having count(person_id) > ?)
0

总结

支持了更多的数据库,Aorm拓展了更多的应用范围

支持了子查询,Aorm更强大了

微信图片_20221226163643.png
微信图片_20221226163643.png

项目地址

tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)

给个 ⭐ 吧,如果这个项目帮助到你

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
万万没想到,go的数据库操作,也能像php一样溜了
很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm一样好用。这篇文章里,我们认真的讨论下这个问题,并且会在后面提出解决方案。
程序员汤汤
2022/12/27
6870
向Gorm大声说拜拜,Aorm你值得拥有
熟悉GO开发的朋友们应该都知道,在GO的web开发领域,gorm的使用非常广泛,但是我使用很长时间后,终于下决心要把它换掉。
程序员汤汤
2022/12/08
5410
想早点下班?试试Aorm库吧,更方便的进行Go数据库操作
使用go进行项目开发,大多数人会使用gorm,但是gorm有一些缺点,我无法接受。于是开发出了aorm,目前能有满足日常开发需求,并且完善了使用文档,希望能够帮助到大家。
程序员汤汤
2022/12/08
6700
ORM哪家强?java,c#,php,python,go 逐一对比, 网友直呼:全面客观
为了让这个库更好用,我比较研究了各语言的主流ORM库,发现有一些语言的ORM库确实很好用,而有另外一些语言的库那不是一般的难用。
程序员汤汤
2023/01/29
2.8K2
ORM哪家强?java,c#,php,python,go 逐一对比, 网友直呼:全面客观
万万没想到,go也能使用对象来操作数据库了,网友直呼:健壮性有保证了
之前给大家介绍的Aorm库,都用上了吗?这可是迄今为止我见过的,go领域最好用的数据库操作库了。
程序员汤汤
2023/01/13
5000
Mssql注入从入门到掌握
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。
渗透攻击红队
2020/11/25
2.8K0
Mssql注入从入门到掌握
SQLite3详细介绍
SQLite 是一个嵌入式 SQL 数据库引擎,它实现了一个自包含、无服务器、零配置、事务性 SQL 数据库引擎。 SQLite 的代码属于公共领域,因此可以免费用于任何商业或私人目的。 SQLite 是世界上部署最广泛的数据库,其应用程序数量之多,数不胜数。
.Vin
2022/07/01
2.7K0
SQLite3详细介绍
使用Spark进行数据统计并将结果转存至MSSQL
在 使用Spark读取Hive中的数据 中,我们演示了如何使用python编写脚本,提交到spark,读取并输出了Hive中的数据。在实际应用中,在读取完数据后,通常需要使用pyspark中的API来对数据进行统计或运算,并将结果保存起来。本节将演示这一过程。
张子阳
2018/08/22
2.3K0
使用Spark进行数据统计并将结果转存至MSSQL
NodeJS中使用mssql模块连接SQLServer数据库
最近看了下NodeJS下连接SQLServer的一些示例,发现NodeJs中有两个模块,一个是mssql,其npm地址是:https://www.npmjs.com/package/mssql;另外一个是:tedious,其npm地址是:https://www.npmjs.com/package/tedious,github对应的地址是:https://github.com/tediousjs/tedious
ccf19881030
2020/03/09
12.4K0
NodeJS中使用mssql模块连接SQLServer数据库
[iOS学习笔记]·FMDB:第三方数据库处理框架·用法示例篇(附源码Demo)
FMDatabase的实例对象_db在执行SQL语句的时候采取类似下面的代码。其中,有两种风格,一种在executeUpdate方法后面直接写上字符串的字面量语法。另一种在执行方法的后面基于SQL字符串初始化一个NSString对象。
陈满iOS
2018/09/10
1K0
[iOS学习笔记]·FMDB:第三方数据库处理框架·用法示例篇(附源码Demo)
MySQL库表操作以及简单查询语句
因为业务层操作内存,MySQL操作磁盘,数据库永远是最先达到性能瓶颈,我们不能把过多的逻辑操作放在数据库上,逻辑操作应该在业务层做。
终有救赎
2023/10/31
4040
MySQL库表操作以及简单查询语句
MySQL与JDBC精简笔记
其实就是定义了操作所有关系数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
Rochester
2020/09/01
4.2K0
MySQL与JDBC精简笔记
Bun:高性能 Go ORM 与 SQL 构建工具
在 Go 生态中,传统的 ORM 往往要么“魔法”过多(如 GORM),要么过于模板化(如 SQLBoiler)。bun 则以 SQL-first 的设计理念,为开发者提供了轻量、高性能且灵活可控的 ORM 和查询构建器。它同时支持 PostgreSQL、MySQL(包括MariaDB)、SQLite、MSSQL、Oracle,并与分布式追踪平台 Uptrace 深度集成,让你在享受 ORM 便捷性的同时,依然对底层 SQL 保有完全掌控权。
孟斯特
2025/04/25
1560
Bun:高性能 Go ORM 与 SQL 构建工具
NodeJS中使用mssql和tedious模块连接SQLServer数据库
最近看了下NodeJS下连接SQLServer的一些示例,发现NodeJs中有两个模块,一个是mssql,其npm地址是:https://www.npmjs.com/package/mssql;另外一个是:tedious,其npm地址是:https://www.npmjs.com/package/tedious,github对应的地址是:https://github.com/tediousjs/tedious
ccf19881030
2022/12/01
4K0
NodeJS中使用mssql和tedious模块连接SQLServer数据库
mysql嵌套子查询的应用
sql语句中一个查询有时未必能满足需求,应对多表联查时就需要进行嵌套查询。嵌套查询的意思是,一个查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。 嵌套查询的工作方式是:先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用。还可以用于insert、update、delete语句或其他子查询中。
OECOM
2020/07/01
4.3K0
2.Go语言项目操作MySQL数据库实践
快速了解 MySQL 数据库 MySQL 是目前主流关系型的数据库,它的胞胎兄弟 MariaDB (MySQL 的一个分支),除此之外使用最多的就是 Oracle 和 PostgreSQL 数据库。
全栈工程师修炼指南
2022/09/29
6.8K0
2.Go语言项目操作MySQL数据库实践
Golang使用sqlite3
在 Go 中使用 SQLite3 数据库,最常见的方法是使用 github.com/mattn/go-sqlite3 这个库。下面是如何在 Go 中使用 SQLite3 的一个简单指南。
孟斯特
2024/08/15
6060
Golang使用sqlite3
登录和退出 MySQL 服务器建表约束数据库的三大设计范式查询练习事务推荐
最近在整理 sql 的时候发现一份优秀的笔记,是原作者学习 sql 所做的笔记,分享这份总结给大家,对大家对 sql 的可以来一次全方位的检漏和排查,感谢原作者 hjzCy 的付出,原文链接放在文章最下方,如果出现错误,希望大家共同指出!
wscats
2020/06/07
5.7K0
MySQL基础教程最佳典藏版(推荐收藏)
https://blog.csdn.net/weixin_45108087/article/details/102766281
挨踢小子部落阁
2019/12/18
6070
MySQL基础教程最佳典藏版(推荐收藏)
NodeJS使用mssql连接SQLServer出现"Incorrect syntax near the keyword \'user\'."
最近使用NodeJS的mssql模块连接SQLServer数据库出现了"Incorrect syntax near the keyword ‘user’."的错误,Google了一下发现原来我在SQLServer中使用了user作为表明,但是SQLServer中user是保留的关键字,不能被用于做表名或者变量名。所以解决方案很简单,直接重命名表名user为t_user或者其他的名称就OK了。
ccf19881030
2020/03/09
2K0
NodeJS使用mssql连接SQLServer出现"Incorrect syntax near the keyword \'user\'."
推荐阅读
相关推荐
万万没想到,go的数据库操作,也能像php一样溜了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档