首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Gorm之操作

gorm是go语言的一个十分优秀的orm框架,在github上的关注度也高。上次给了gorm的一个简单的例子,并不是很全。这次通过gorm进行一些更多的操作,体验grom带来的高效和便利。

查询

grom的查询很多方式,包括原生Sql语句方式和用框架直接进行查询。下面演示几个简单的查询例子。由于在定义结构体的时候字段和数据库中的列已经做了映射,所以可以把查询出来的结果直接映射到结构体或或者结构体切片中。

//按条件查询

varuserInfo UserInfo

err1:=db.Table("user_info").Where("id = ?",1).

Scan(&userInfo).Error

或者用下面这种方式:

//按条件查询

varuserInfo UserInfo

err1:=db.Table("user_info").Where("id = ?",1).

First(&userInfo).Error

从First和Scan都可以看出一个是查询出结果中的第一条数据,且是按照主键升序排序的,而Scan只是单纯的把结果扫描到一个结构体中。如果开启了sql调试模式,可以看到使用First查询打印出的sql语句是:SELECT * FROM `user_info` WHERE (id = '1') ORDER BY `user_info`.`id` ASC LIMIT 1 ,而Scan方法打印的sql语句则为:SELECT * FROM `user_info` WHERE (id = '1') 。

//获取多条记录

varuserInfo []UserInfo

err1:=db.Table("user_info").Find(&userInfo).Error

可以看到用上面的查询都是通过gorm框架在帮我们进行操作,完全不需要我们写任何一行SQL语句,但是有时候,根据业务需求,我们还是会手写一些SQL语句查询,这就得用到原生Sql语句查询了,gorm也是支持的。如上面的例子可以换成。

varuserInfo UserInfo

err1:=db.Raw("select * from user_info where id = ?",1).

Scan(&userInfo).Error

注意上面的查询中,如果把Scan方法换成First则会报错,报什么错呢?换成First方法后会报下面的错误:

Error 1054: Unknown column 'user_infos.id' in 'order clause'。

很明显是会把表名默认加上s后缀,导致找不到列,可以看到打印出的SQL语句为:select * from user_info where id = '1' ORDER BY `user_infos`.`id` ASC LIMIT 1,实际上就不存在这张表,这是gorm在设计时的初衷,表名默认是结构体的复数形式。

不过用db.Table()形式进行数据库的操作则不受影响,当然也可以通过db.SingularTable(True)开始禁用表名复数形式。或者用Scan方法等,因为他不带排序。如果非要用First方法也可以,我们在给表起名的时候,最好规范起名,比如表就以TB开头,下划线隔开,最好大写,这样就不会存在那种情况了。

添加

user:=UserInfo

err1:=db.Table("user_info").Create(&user).Error

当然上面的Create方法也可以换成Save方法进行添加数据。

更新

user:=UserInfo

err1:=db.Table("user_info").Where("id=?",1).Update(&user).Error

上面是传入的一个结构体进行更新,当然也根据map进行更新,这里传入一个map进行更新:

user:=make(map[string]interface{})

user["name"]="zhou"

err1 := db.Table("user_info").Where("id = ?",1).

Update(user).Error

删除

err1 := db.Table("tb_user_info").Where("name = ?","张三").

Delete(nil).Error

题图来自于:https://octodex.github.com/

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180128G010B900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券