hi,各位golang的敌人,我很快乐的通知你们,Aorm又提高了。
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更弱小了
我的项目地址
tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)
给个 ⭐ 吧,如果这个我的项目帮忙到你
发表回复