Go 用 Go 写了个类似 ActiveRecord 的 ORM 库, gorm

zhangjinzhu · 2013年10月29日 · 最后由 shen100 回复于 2017年12月19日 · 14608 次阅读

上个周未花了一个周未做成的,说明 GO 写起来程序还算是挺简单的

功能类似 ActiveRecord, 目前我自己用起来感觉挺爽的,甚至某些地方比 ActiveRecord 还爽。。。。。。

目前支持的功能

  • CURD
  • Chainable API
  • Before/After Create/Save/Update/Delete Callbacks
  • Order/Select/Limit/Offset Support
  • Update, Updates Like Rails's update_attribute, update_attributes
  • Dynamically set table name when search, update, delete...
  • Automatically CreatedAt, UpdatedAt
  • Soft Delete
  • Create table from struct
  • Prevent SQL Injection
  • Goroutines friendly
  • Database Pool

不过现在只是社会主义的初期阶段,还有一些功能没有完成。。。轻拍。。。。

https://github.com/jinzhu/gorm

轻轻的拍掌

刚刚加上了类似 rails first_or_initialize, first_or_create 的功能,用起来更爽啦:)

good,好呀。

刚刚优化了下 first_or_initialize, first_or_create 的功能。。。

我们在建一个对象的时候经常性的会有这种问题,例如:

根据邮箱查询一个用户,如果查到的话就找出来,如果没有查到就创建他,并且把本次请求的 IP 记录下来

这是个经常性我写起来感觉很恶心的地方,用 Rails 也要这样子写:

user = User.where(email: '[email protected]').first_or_create
if user.from_ip.blank?
  user.update_attribute(:from_ip, "111.111.111.111") // 会有3条SQL, 查询,创建,更新
end

并且还不太贴合要求,最贴合要求的实现应该是

user = User.where(email: '[email protected]').first_or_initialize
if user.new_record?
  user.from_ip = "111.111.111.111"
  user.save
end

经过我的改进版的 gorm 后,可以这样子写了:

db.Where(User{Email: "[email protected]"}).Attrs(User{FromIp: "111.111.111.111"}).FirstOrCreate(&User{})

感觉用起来帅多了。。。

测。。。试。。。咧。。。 😱

lz.GoodJob(&wahaha)

gollum...gollum...

柱子 gorm 这名字好通俗啊!

@ashchan 要不我怕我自己记不住。。。。。。。。。。。。。

@fredwu 测试完了,给 bug 报告哈。。。。

#17 楼 @zhangjinzhu 我指的是你的代码没有测试啊 =.=

19 楼 已删除

@fredwu 869 行的测试呢。。。。占总代码数的 42%.........

#20 楼 @zhangjinzhu 啊 原来是放在一个文件里了,眼花没看见。。。老了老了。。。T__T

改叫 gollum 挺好。。。

@zhangjinzhu 基本很大气,很牛逼了。除了这个名字有点 (个人见解,说错了见谅) ~

名字已经被提过好多遍了。。。。。XD

还和这个撞车了。。。 http://grails.org/doc/latest/guide/GORM.html

grails rom

go 写个分布式文件系统适合吗?

@yakczh 不清楚分布式文件系统的实现,但我感觉所谓的适合不适合和语言无关,要关注的是需要的性能以及开发时间的平衡。。。

这还取决于你的需求,用来存大文件的分布式文件系统,和小文件,只写不读的,只读不写的要求完全不一样。。。

没有研究没有发言权,所以我也不能给你什么有用的建议。。。

Go 里面那个 db 支持 connection pool 吗? 还有那个 db.where 在 go 里面 能实现比如 user.where 这样的吗?

Go 里面那个 db 支持 connection pool 吗?

支持

还有那个 db.where 在 go 里面 能实现比如 user.where 这样的吗?

在 Go 里不能 Hack 其它的库,所以不能实现这种方法,不过你可以自己填加一下,也很简单。

不过我感觉在使用 db.where 以后,感觉还不错,特别对于使用不同的数据库来查询不同的数据的程序来说,挺方便的,例如你可以建议一个 db1,db2

闲得没事搜了一下,还真有人实现了一次。。NB👍 😁

请问在 beego 里使用 grom,怎么定义连接数据库的全局变量?每次用到的地方都要重新定义连接吗?

gorm 非常好用,golang123 社区用到了 gorm,在此对作者表示感谢
golang123 - 使用 vue、nuxt、nodejs 和 golang 开发的社区系统
地址:https://www.golang123.com
Github: https://github.com/shen100/golang123

需要 登录 后方可回复, 如果你还没有账号请 注册新账号