V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  f0rb  ›  全部回复第 2 页 / 共 2 页
回复总数  32
1  2  
想搞副业的都是想立即获得现金流的,但真正能发大财的都需要一定的时间沉淀,先建好护城河,再考虑赚钱,一般人扛不住
@wwhontheway 传统的 ORM 概念里,使用实体构建一些使用等号为比较符的查询条件,使得实体对象额外承担了构建查询子句的责任,显然不符合单一职责原则。

实体对象的字段只能对应一个列名,如 age ,但是查询子句可能会包含同一列的多个查询条件,如 age > ? and age < ?,这就是使得实体对象无法同时兼顾列名的映射和查询条件的映射。

而单独使用查询对象构建查询子句就不存在这样的限制,例如
type UserQuery struct {
PageQuery
Name *string
NameNe *string
Age *int
AgeLt *int
AgeGt *int
}

注意这里字段的类型都是指针,在构建查询子句时,只为不为 nil 的字段构建查询条件和参数。
@wwhontheway intentory.go 里就包含了增删查改的全部代码

Gorm 只能基于 model 构造比较符是’=‘的查询条件:

db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;

非=的查询条件需要手搓:

db.Find(&users, "name <> ? AND age > ?", "jinzhu", 20)
// SELECT * FROM users WHERE name <> "jinzhu" AND age > 20;

而使用 GoooQo ,你只需要定义好查询对象,
type UserQuery struct {
PageQuery
NameNe *string
AgeGt *int
}

然后基于查询参数构造实例就好了
userDataAccess.Query(ctx, &UserQuery{NameNe: PStr("f0rb"), AgeGt: PInt(20)})

这就是 OQM 技术中通过后缀来推导字段对应的查询条件。查询对象专注于构建查询子句,符合单一职责原则。

好处就是,前端向后端传递查询参数时,可以通过反射自动构建查询对象的实例。而当需求变更需要增减查询条件时,只需要在查询对象里增减字段即可。
@VVVYGD 我看到你这个是 rust 写的,我是先用 Java 写了一个,然后写专利的时候写了个 Go 的,来验证 OQM 这个 idea 是不是能适用所有语言
@VVVYGD 我这里面也有个 MongoDB 的模块,这次文章里没提,用的是代码生成的方法,比如为 QtyGt 生成这样的代码 if q.QtyGt != nil {
d = append(d, D{{"qty", D{{"$gt", q.QtyGt}}}})
}
完整的在这里:
https://github.com/doytowin/goooqo/blob/main/main/inventory_query_builder.go
@matrix1010 我这里一张表只需要编写实体对象和查询对象两个结构体,根据查询对象字段的名称生成查询条件,生成方式有两种,一种是通过反射读取字段信息,生成查询条件,一种是通过 gen 包为查询对象生成一堆 if 来拼接查询条件,比如这个 https://github.com/doytowin/goooqo/blob/main/main/user_query_builder.go 。 除了这两个结构体和两行构建代码,其他代码全部都封装了。
没明白你这里说的完全手写是什么意思。

我这里的代码生成是基于查询对象生成 if 构建语句,而不是从表生成实体对象。
我感觉国外一些开发一看到 ORM 几个字母就 PTSD 了,也不看内容,一上来就攻击你
2024 年 8 月 26 日
回复了 lieyan 创建的主题 程序员 现在的人都这么无聊这么恶心了吗?
@laminux29 还能这么搞?我的是腾讯云的 CDN+OSS 的静态网站,如果不挂 CDN ,我怕刷 OSS 的费用更高
2024 年 8 月 26 日
回复了 noconfuse 创建的主题 程序员 2 年独立开发,我要去吃土了
我也搞了两年了,感觉对做技术的来说,推广好难哪
2024 年 8 月 23 日
回复了 f0rb 创建的主题 程序员 请教在 Reddit 上推广项目有什么要注意的?
Google 总能搜到,没想到踩雷了,换 dev.io
前期设计的工作很少,大部分是编码工作,正常团队里 5-10 个开发配一个 UI 足够了
1  2  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   903 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 18ms · UTC 19:49 · PVG 03:49 · LAX 11:49 · JFK 14:49
♥ Do have faith in what you're doing.