Published on

gorm 使用笔记

Authors

结构体字段名映射

// User 用户模型
type User struct {
	gorm.Model
	UserName       string
	PasswordDigest string
	//Nickname       string
	Status         string
	Policy         string
	Avatar         string `gorm:"size:1000"`
	AbAc		   string
}

gorm自动建表字段则为

  `user_name` varchar(255) DEFAULT NULL,
  `password_digest` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `policy` varchar(255) DEFAULT NULL,
  `avatar` varchar(1000) DEFAULT NULL,
  `ab_ac` varchar(255) DEFAULT NULL,

结构为AbAb转换为ab_ab

分页查询

model.SensorDB.Table(s.ProjectTableName).Select(
	"zhgd_building_tilt_monitoring.id,\n"+
	"zhgd_building_tilt_monitoring.monitoring_project,\n"+
	"zhgd_building_tilt_monitoring.this_change,\n"+
	"zhgd_building_tilt_monitoring.history_change,\n"+
	"zhgd_building_tilt_monitoring.rate_change,\n"+
	"zhgd_building_tilt_monitoring.monitoring_date,\n"+
	"zhgd_building_tilt_monitoring.sum_alarm_status,\n"+
	"zhgd_building_tilt_monitoring.change_rate_alarm_status").
		Limit(s.PageSize).
		Offset((s.Page -1)*s.PageSize).
		Rows()

Limit 设置每页数量 Offset 设置偏移参数,实现分页

迭代rows

	for rows.Next(){
		if err := rows.Scan(&data); err != nil{
			return serializer.DBErr("rows迭代失败", err)
		}
		datas = append(datas, data)
	}

只要row.Next()为真,则能一直迭代,直到全部查找完毕。 用Scan将每一行数据,写入到data数据结构中(不支持结构体)。 上面的写法不支持将数据scan到结构体中

多列多行分页查询

	datas := make([]model.BuildingTilt,0)

	err := model.SensorDB.Table(s.ProjectTableName).Select(
		"id,\n"+
	"monitoring_project,\n"+
	"this_change,\n"+
	"history_change,\n"+
	"rate_change,\n"+
	"monitoring_date,\n"+
	"sum_alarm_status,\n"+
	"change_rate_alarm_status").
		Limit(s.PageSize).
		Offset((s.Page -1)*s.PageSize).Scan(&datas).Error

自动将多行数据,写入切片中,不需要迭代操作。

  • 另一种多行查询方法