V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  lesismal  ›  全部回复第 55 页 / 共 81 页
回复总数  1612
1 ... 51  52  53  54  55  56  57  58  59  60 ... 81  
2022-07-05 11:45:35 +08:00
回复了 gowk 创建的主题 程序员 用 Go 开发公司内部的业务系统,后端该如何选型?
@BeijingBaby
非常同意,那些搞了一大套微服务的各种、或者集成 ORM 之类的,都是适合他们自家业务而已。而且很多集成别人的库的项目,说句不好听的,都不应该叫框架
2022-07-05 11:34:53 +08:00
回复了 gowk 创建的主题 程序员 用 Go 开发公司内部的业务系统,后端该如何选型?
@gowk #55
sqlw

OP 你瞅一眼试一下,还有比我这个好用的吗。。。

```golang
result, err := db.Insert("insert into sqlw_test.sqlw_test", &m)
if err != nil {
log.Panic(err)
}

result, err := db.Delete("delete from sqlw_test.sqlw_test where id=?", deleteId)
if err != nil {
log.Panic(err)
}

m := Model{
I: 1,
S: "str_1",
}
updateId := 1
result, err := db.Update("update sqlw_test.sqlw_test set i=?, s=? where id=?", &m, updateId)
if err != nil {
log.Panic(err)
}

var model Model
selectId := 1
result, err := db.Select(&model, "select * from sqlw_test.sqlw_test where id=?", selectId)
// result, err := db.SelectOne(&model, "select (i,s) from sqlw_test.sqlw_test where id=?", selectId) // select some fields
if err != nil {
log.Panic(err)
}

var models []*Model // type []Model is also fine
result, err = db.Select(&models, "select * from sqlw_test.sqlw_test")
// result, err = db.SelectOne(&models, "select (i,s) from sqlw_test.sqlw_test") // select some fields
if err != nil {
log.Panic(err)
}
```
2022-07-04 19:35:53 +08:00
回复了 gowk 创建的主题 程序员 用 Go 开发公司内部的业务系统,后端该如何选型?
直接用我出品的库吧,用 RPC 的接口方式交互,既支持普通的 HTTP RPC CALL 请求,也支持 Websocket 长连接 RPC CALL ,可以 Server 端主推送,中间件都可以定制,协议交互的各种业务类型都方便支持:
github.com/lesismal/arpc
web 的例子看这里:
github.com/lesismal/arpc/tree/master/examples/webchat

数据库也用我这个,比什么 ORM 或者其他的 RawSql 库都简单易用方便得很(隔壁帖子前阵子刚有人喷 go 的 ORM 呢):
github.com/lesismal/sqlw
例子看这里:
github.com/lesismal/sqlw_examples
前几天刚发过帖子:
www.v2ex.com/t/861739

不要以为 star 少不好用,那是因为做得晚、现在几个国内 go 站长都忙着卖课程挣钱所以论坛没人看了推广不起来、我也不屑于去加那些互相捧臭脚的技术饭圈,有不少项目 KPI 搞假玩意忽悠人呢、氛围太恶心

吹个牛说,我提供的都是最强方案,如果哪位不服,来看看试用下欢迎来跟我 battle 。
2022-06-27 16:41:46 +08:00
回复了 oyp 创建的主题 程序员 在 jQuery 环境下,怎么开发 SPA 应用程序,怎么配置路由?
试试我这个:
github.com/lesismal/pmjs

本人非专业前端,主要原理就是多个页面共存,当前显示谁就把 i 其他的隐藏,纯原生、如果你控场能力强、性能可以做到最强。
代码也不多,有需要的话 OP 可以随便改。
2022-06-27 12:21:04 +08:00
回复了 F4NNIU 创建的主题 程序员 你为什么做开源软件?
为了日常能使用简单方便又高性能的框架,为了去解决实际的工程问题,为了给自己留个念想

1. 除了性能高,这可比其他只有 RPC 功能的 RPC 框架好用太多了,缺点是只支持 go/js ,精力有限,照顾不到太多语言
https://github.com/lesismal/arpc
2. go 全网唯一支持 tls/http1.x/websocket 的 poller 网络框架,底层异步,应用层仍然同步,基本兼容标准库,方便与其他知名库结合比如 gin/echo ,性能>=目前已知的同类 poller 库
https://github.com/lesismal/nbio
3. 这几天刚造的,标准库的 sql 确实大道至简但应用层被迫繁冗,而且市面上的所有 go ORM 和 rawsql 库都没能达到我对简洁的定义的标准:
https://github.com/lesismal/sqlw

有兴趣的同学欢迎看我历史主题
@lesismal #31

"Select/Delete 都只是 Query/Exec 的简单封装"
——这里的 Select 简单封装是只 sqlw.Select 是对 sqlw.Query 的封装,不是指对标准库的简单封装
2022-06-27 12:07:44 +08:00
回复了 fstar 创建的主题 程序员 如何看待封闭开发?
钱到位的话可以,多少算到位自己衡量。
当年史玉柱做《征途》好像就搞封闭开发,他的兄弟们也都跟着发达了。
但现在时代变了,这种机会很少了,不行就 Move 甚至 Run 。
@yiplee 其实最开始只是想把 Query 做下映射的、免去了 for rows.Next scan 的麻烦,但是自己写点示例的时候使用 Exec 还是不够方便,所以这两天又加了其他三个
@yiplee
使用 Query/Exec 可以实现所有操作,毕竟标准库就是这样的。

Select/Delete 都只是 Query/Exec 的简单封装,主要是为了用户层使用时的语义更加明了,Insert/Update 同样也可以更明了一些。

单独提供 Update 的另一个原因,是由于直接使用 Exec 不知道是增删改查哪种操作,所以不方便处理结构体与 sql 字段的映射,比如 Exec 的方式我用当前的一个 Model Obj 字段去 Update ,还是得像标准库一样把 Obj 每个字段都列出来,而现在可以只传一个 Obj 。如果是想把 Exec 也支持结构体映射,则需要再去做一层 sql 语句类型判断,一是又多浪费了一点性能二是复杂语句判断逻辑实现起来也吃力,比如 select for update 、多条语句全都有之类的,所以单独提供了 Update ,复杂的需求才去用 Exec 。

总结下来就是 业务层更简洁明了+降低实现复杂度。
@yiplee
sqlc 用着还是有点麻烦的,我昨天更了一版直接增删改查也都提供了,应该是比 sqlc/sqlx 省事多了,不信你看下。。。
github.com/lesismal/sqlw
@liaohongxing 想了下,还是不应该自动 Rollback ,比如一个事务多个语句,其中一个语句 duplicate key 了,但是业务层自己会判断 duplicate key 并继续执行事务其他逻辑,如果框架自动判断 err 回滚了,业务层就没法继续了
@liaohongxing 也可以做自动 Rollback ,sqlw.Tx 再把 sql.Tx 的 Exec 包装一道,然后 Query/Exec 里都先判断下 sql.Tx 执行是否有 err ,有就回滚。但是这样的话,与标准库用法又有差异了,用户外面如果也写了 if err rollback 倒是影响不大。
我先琢磨琢磨看要不要加自动回滚
@EscYezi #19
首先,这写法似乎并没有比 sqlw 现在的样子更省事呀,兄弟你看我的示例代码。
而且 go 的泛型不是万能的,泛型适合具有同一类别方法的类型比如数值类,都可以进行基础的数学运算,然后泛型里不同的类型实例也可以加减乘除,但是如果你的逻辑里包括用泛型的数学运算但是你实际传的确实一个结构体进来,就不行了。c++那种泛型方便是因为可以操作符重载可以把各种需要的 class/struct 实现同类方法( go 的接口能实现这种但是不能满足泛型的需求比如返回值的类型),而 go 没有操作符重载。对于未知类型类别的参数,sql 库里去做字段映射时,仍然是需要用 reflect 实现。
@liaohongxing go 事务的用法是 tx, err := db.Begin(),但创建 tx 后的执行多条语句也是由用户实现的、框架层不好去判断,正确的用法是创建 tx 成功后直接 defer tx.Rollback() 就可以了,后面如果 Commit 成功了、defer Rollback 执行时会失败但不影响正确的逻辑,defer tx.Rollback()还可以避免连接泄露,比如中途 panic 了、既没有 Commit 也没有 Rollback ,因为 tx 独占一个 sql 连接,只有 Commit 或 Rollback 后才会把连接放回连接池给其他地方用。正确用法参考:
github.com/lesismal/sqlw_examples/blob/main/tx/tx.go#L26
直接使用标准库同样也是应该这样子的,否则就存在泄露的隐患
@jam1024
如果按这个逻辑,那 c 语言早该被消灭了才对。然而并不是所有业务都是简单的 curd 。
另一个话题,curder 的收入也是个很难突破的瓶颈,要提升实力和收入,怎么办?固守所谓的使用高级语言?当顶流量级项目来临需要应对性能问题自己无从下手只能看着别人出手?
不能要求并期望所有人都只做 curder 的。
@jam1024 sql 与 ORM ,我觉得 @pastor 老兄 #12 这段虽然很逗,但确实又很贴切: “人家是门语言,你们却像嫖客一样上来对人家一顿胡搞猛搞、连自己做了啥都不知道,然后还说 ORM 真香,真是对自己对 sql 都不负责,妥妥的渣男。。。”
@jam1024
我没预料到兄弟你认为 ORM 比 rawsql 难、ORM 比 rawsql 更安全。关于这两点,我的感觉刚好跟你相反。
@pastor #12
其实其他那些 ORM 比较完善的语言,在做那些数据量不大的对性能没啥要求的项目时还可以的,比如学校的管理系统,公司的 OA ,这些通常单表都很小的没啥压力,用习惯了 ORM 的同行开发效率还是蛮高的

@jam1024 #14
比如 http 服务一个 routter handler:
1. 如果是只需要某个特定的表,直接用一些三方工具导出与表结构映射的 struct 拿来直接用就可以了,比如 model.User 结构体或者结构体数组拿来接收 Query 的结果
2. 涉及多表联查的,我们通常 router handler 文件里单独声明 struct 用于接收 rawsql 的字段,其实并不麻烦,而且通常规范点的项目,除了数据库的 model ,c/s 交互也是有规范的协议格式的,所以不管是 json 还是 pb 还是其他、不管是否联查、声明一个结构体这一步多数时候本来就已经存在于流程中了
@mcfog #6
sqlx 我没太用,自己以前主要是使用标准库 rawsql 。sqlx 、gorm 、xorm 也都简单看过他们的文档教程、还是挺复杂的,相比于使用标准库 rawsql ,这些 sql 库学习成本更高、姿势有点多反倒需要去注意更多问题。
sql 的主要操作,就是增删改查,标准库的查询用 Query/QueryRow ,其他的用 Exec ,非常简洁明了,麻烦的地方就在于 Query 相关的 rows 到结果的 Scan 。
sqlw 把遍历 rows 去 Scan 这些省掉了,中间的一堆 if err 也省掉了。使用 rawsql 能让程序员保持对 sql 语句的功能、性能直观和敏感、减少或者避免 ORM 背后行为那些隐藏的细可能导致拼接出来的 sql 不是自己想要的、甚至出其他问题,而且虽然不是 ORM ,但是执行语句与结果映射到结构体一步到位,还是很省力了。

@dorothyREN #7
go 完全避免 if err 是不太现实的,sqlw 帮助去减少了 for rows.Next{ rows.Scan }这些地方的很多 if err 。
另外,很多人对 if err 抱怨,却没去想过,go 这样使用 if err 让他们的代码更健壮了。相比于其他一些语言用异常处理错误,go 把错误、异常各管各的其实更清晰,只是很多人“先入为主”,用习惯了以前的某种姿势或者框架提供的方式、不想去改变成更合理的方式罢了。
@pansongya 混杂是指 sql 和 sqlw 同时?还好吧,sqlw 把 DB 、Stmt 、Tx 这几个都包装了下,使用 db.Prepare/Begin 返回的是 sqlw 的 Stmt/Tx ,Query 相关的写起来就都简单了,我再考虑要不要增加个 Insert 、Update ,怎么设计能保持简单与优雅。

mybatis ,java 和 go 真的是繁冗与简洁的两个典型了,所以我估计不会去模仿任何一个 java 相关的方案了 /手动狗头 。。
1 ... 51  52  53  54  55  56  57  58  59  60 ... 81  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2795 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 14:48 · PVG 22:48 · LAX 06:48 · JFK 09:48
♥ Do have faith in what you're doing.