首页 > 数据库 >Aorm又进步了,目前已支持MySQL,MSSQL,Postgres,Sqlite3,并且支持子查询

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

时间:2022-12-26 16:55:42浏览次数:65  
标签:count aorm Aorm 查询 person MySQL Sqlite3 article id

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

微信图片_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 数据库,可以直接使用如下的代码,来进行一次插入

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如下

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做一些修改,例如

id, errInsert := aorm.Use(db).Debug(true).Driver("mssql").Insert(&Person{
    ....
})

它产生的sql如下

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里,加上了

select ID = convert(bigint, SCOPE_IDENTITY())

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

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

returning id

支持子查询

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

将子查询用在字段上

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())
}

你可能已经注意到

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

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

   SelectExp(&sub, "article_count").

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

SELECT *,(SELECT count(id) AS article_count_tem FROM article WHERE person_id=person.id) AS article_count FROM person WHERE age = ?
18

将子查询用在查询条件上

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())
}

如你所见

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

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

   WhereIn("id", &sub).

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

SELECT * FROM person WHERE id IN (SELECT person_id FROM article GROUP BY person_id Having count(person_id) > ?)
0

总结

支持了更多的数据库,Aorm拓展了更多的应用范围
支持了子查询,Aorm更强大了

微信图片_20221226163643.png

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

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

标签:count,aorm,Aorm,查询,person,MySQL,Sqlite3,article,id
From: https://www.cnblogs.com/tangpanqing/p/17006185.html

相关文章

  • mysql自动增长设置
    首先将那个要增长的键设成主键,然后再进行设置初始值和增长步长。例如:现在一张book表1altertablebookaddidBIGINT;--为book表增加一个名称为id,类型为bigint的列......
  • apscheduler mysql 持久化任务
    apschedulermysql持久化任务1、下载第三方包这里使用pymysql连接mysqlpipinstallapschedulerpipinstallpymysqlpipinstallsqlalchemy2、直接参考代码imp......
  • mysql实现limit分页
    1.背景:背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?背景2:表里有4条数据,如果只想要显示第2、3条数据怎么办呢?MySQL中使用LIMIT实现分页......
  • 我对《Mysql死锁排查:insert on duplicate死锁一次排查分析过程 - 少说点话 - 博客园》
    原文在这里:Mysql死锁排查:insertonduplicate死锁一次排查分析过程 比较菜,看了一遍还是不懂死锁是怎么形成的。绕了很多圈才全理解。特此记录。 关于mysql版本我先......
  • MySql在ONLY_FULL_GROUP_BY模式下分组查询报错问题的解决
    MySQL5.7.5及以上版本在进行groupby查询报错:ORDERBYclauseisnotinGROUPBYclauseandcontainsnonaggregatedcolumn或SELECTlistisnotinGROUPBYclause......
  • MySQL索引
    1.索引是什么索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。简单来讲,数据库索引就像是书前面的目录,能加快数据库的查询速度。(1)索引......
  • 关于使用DBeaver连接MySQL-8.0.30-报错-Public Key Retrieval is not allowed
    关于使用DBeaver连接MySQL-8.0.30,报错:PublicKeyRetrievalisnotallowed也即是:不允许公钥检索但如果此时,我们在cmd命令行以DBeaver使用的用户名,通过mysql-uxxx-p......
  • MySQL 8.0 为什么会放弃查询缓存?
    什么是查询缓存?查询缓存就是将一次查询结果存储在内存中,假如下一次查询结果在内存中,就直接在内存中读取。MySQL查询缓存原理就是将查询SQL进行Hash处理,然后将结果存进内......
  • StoneDB 团队成员与 MySQL 之父 Monty 会面,共话未来数据库形态
    「9月中旬,StoneDB团队成员有幸与开源数据库MySQL和MariaDB的创始人Michael“Monty”Widenius(后文简称为Monty)见了个面,其随行的团队成员告诉我们,疫情前Monty每年还能来一......
  • MaterializeMySQL引擎
    1、概述MySQL的用户群体很大,为了能够增强数据的实时性,很多解决方案会利用binlog将数据写入到ClickHouse。为了能够监听binlog事件,我们需要用到类似canal这样的第......