我用 Golang 写了个增删查改框架 GoooQo,正在尝试做一些推广,欢迎给点意见

75 天前
 f0rb

GoooQo 是一个基于 OQM ( Object Query-Language Mapping )技术的框架。

OQM 技术与传统的 ORM ( Object Relational Mapping )技术的最大区别是,OQM 技术提出通过对象直接构造各种增删查改语句。项目目前还是一个 MVP ,已经完成了基于字段后缀推导查询条件的功能,例如通过字段名称ageGt推导出对应的查询条件为age > ?。并且围绕数据库的增删查改接口构建了一个简单的 RESTFul 模块提供 Web 的 API 。

目前打算通过撰写文章和 Demo ,尝试在掘金、HelloGitHub 、Hacker News 、Reddit 、Product Hunt 等平台进行一些推广。

掘金新发的文章今天在反馈页吐槽了一下展现数的问题,编辑提了点修改意见后就给推荐上了首页,到现在有 6000 多的展现量了。其他的,HN 的帖子太容易沉了,Reddit 感觉很容易被 downvotes 然后被屏蔽,所以来请教下大家有没有什么好的推广方法。

掘金文章: https://juejin.cn/post/7406900130764881972

GitHub 地址: https://github.com/doytowin/goooqo

Demo 地址: https://github.com/doytowin/goooqo-demo

1728 次点击
所在节点    程序员
30 条回复
VVVYGD
61 天前
差不多吧, a > 1 会转换成 yacc 语法解析成 field(a, gt,1). ->. mongo 的实现者转换成 真实的 {$gt:{a:1}}
VVVYGD
61 天前
@f0rb 例如 :a=1&&b=2||c=1&&b=2&&abc='abc21' 转换成的就是
MongoFilter(Document({"$or": Array([Document({"$and": Array([Document({"a": Document({"$eq": Int64(1)})}), Document({"b": Document({"$eq": Int64(2)})})])}), Document({"$and": Array([Document({"c": Document({"$eq": Int64(1)})}), Document({"$and": Array([Document({"b": Document({"$eq": Int64(2)})}), Document({"abc": Document({"$eq": String("abc21")})})])})])})])})


参考 https://github.com/ddx2x/crossgate/blob/master/src/store/condition.rs 测试样例
f0rb
61 天前
@VVVYGD 不一样哦,a > 1 对应 field(a, gt,1) 需要 3 个参数,而 aGt 只需要一个参数,值是跟着参数传进来
前后端传参也不一样的方式也不一样,aGt=1 对应 json 是{"aGt":1}, 或者是?aGt=1&b=2, 不太清楚你这个前端参数是怎么传的,我这也有个构造或语句的例子: https://juejin.cn/post/7409608924054700047
f0rb
61 天前
@VVVYGD 而且使用字符串不利于 IDE 的代码检查还有代码重构和复用
VVVYGD
60 天前
@f0rb 其实就是类似 SQL 解析,这里 https://github.com/ddx2x/crossgate/blob/master/condition/src/cond.rs
https://github.com/ddx2x/crossgate/blob/master/condition/src/cond.y 将语法树解析为 Expr ,然后将解析的 Expr 转换成 mongo 的谓词条件 https://github.com/ddx2x/crossgate/blob/master/src/store/mongo/filter.rs ,当然其实这个过程直接转换成 mongo SDK 的对象 doc. 例如原本 sql:select username ,amount from users where local="abc" and(xx=1 or
b =2 and c=3) 我这边的使用写法是 new_condition().withTable("users").fields(["username","amount"]).wheres(#b" local="abc" && (xx=1 || b=2 && c=3)")
VVVYGD
60 天前
@f0rb 因为这个是转换成 Expr 的,在 rust 里是可以做前置检查的。
f0rb
60 天前
@VVVYGD 所以你这里每条查询都需要构造一次类似这样的条件是吧:#b" local="abc" && (xx=1 || b=2 && c=3)",那你这种怎么重用了,到处都是字符串吗?你这里不过是把 AND 换成&&,OR 换成||了,别的和 SQL 有什么区别呢?你并没有造出个新轮子,只是给旧轮子涂了层新漆。

你要考虑到做一个信息系统, 前端都会有多个输入框由用户填写查询条件进行搜索,而多个查询条件是可以任意组合的,只能靠 if 语句判断用户是否填写了某个条件来决定是否拼接对应的条件,不知道这种场景你是怎么处理的。

pub enum MongoOp {
Eq,
Gt,
Gte,
Lt,
Lte,
Ne,
Like,
NotLike, // { item: { $not: { $regex: "^p.*" } } }
In,
NotIn,
}

我看你这里都定义了这些谓词了,你直接把列名和他们拼接成 ageGt 这样,再解析成条件岂不是方便多了。
f0rb
60 天前
@VVVYGD "其实就是类似 SQL 解析"
看懂了,我做的东西和你不一样,
你做的是 SQL 转 MongoDB
我做的是对象转 SQL 或者 MongoDB 或者其他 NoSQL 语言
VVVYGD
52 天前
@f0rb 是的,这里用了一种类 SQL 的方式去转成 mongo 的查询,也可以实现其他的的 nosql 查询,虽然我也不太明确还有哪些语法,哈哈。
f0rb
50 天前
@VVVYGD 是啊,因为所有的查询本质上都是两个值进行比较嘛,只不过不同的语言用的语法不一样
我这里是把比较语法集成到面向对象语言的字段名称上了
一般人有点不理解这个思路,所以感觉好难推广

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1067908

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX