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/
领取专属 10元无门槛券
私享最新 技术干货