gorm操作数据库

gorm官方学习链接

操作总结

func (deploy *DeploymentConf) Get(application, server, instance string) error {
	err := DB.Table(DEPLOYTABLENAME).Where(map[string]interface{}{"application": application, "server_name": server, "deployment_name": instance}).Find(deploy).Error
	return err
}
  • DB.Table(tableName).where().find()/first()单条数据,若数据不存在会报错
    DB.Table(tableName).where().find([]slice)/first([]slice)多条数据,若数据不存在不报错。
  • Where条件中匹配多个查询条件用map时,必须声明为map[string]interface{}的形式。

ID int gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"

  • 主键声明为自增时,不要在tag中加type类型说明
type UnmarshalOfServerDel struct { //json请求解析结构体
	Application string `json:"application" valid:"matches(^[a-zA-Z][a-zA-Z0-9]+),length(1|64)"`
	ServerName  string `json:"server_name" valid:"matches(^[a-zA-Z][a-zA-Z0-9]+),length(1|64)"`
}

// HandleFunc ...
func (s *ServerDeleteStruct) HandleFunc(req string) (rsp interface{}, ret int, err error) {
	var input UnmarshalOfServerDel
	SLOG.Debugf("req: %v", req)
	err = json.Unmarshal([]byte(req), &input)
	if err != nil {
		SLOG.Warnf("Json unmarshal req fail: %v", req)
		return nil, -1, err
	}
	_, err = govalidator.ValidateStruct(&input)
	if err != nil {
		SLOG.Warnf("govalidator error: %v", err)
		return nil, -1, err
	}
}
  • Json.Marshal/json.Unmarshal()中用到的结构体的字段必须是大写可导出,否则会忽略结构体中小写字段的导出和匹配。若结构体当中有匿名结构体成员其Json.Marshal/json.Unmarshal()的效果和直接把嵌套结构体的数据成员写到外层结构体是一样的。
  • Marshal(nil)的结果为乱码。
  • Tx=db.begin()开启事务后,DB变量用tx代替。
  • Govalidate中的字段和前面的字段保持一个空格的间距

mvc操作数据库

1.原有MVC: 后台模块操作数据库的 MVC 方法 ,model层直接操作数据库之前加一层control控制层与web前端交互。经常会在web项目中用到MVC模式的写法:

  • M: 数据访问层,负责直接调用数据库 (最好有层次,分开控制逻辑和直接操作数据库的逻辑)
  • C: 控制层Controller,负责对请求的url分发到不同的url(处理请求的入口)。
  • V: 只负责从数据库获取数据,并显示。(web项目中用到)

2.新MVC:表示层调用控制层,控制层调用业务层,业务层调用数据操作层。

  • DAO层:数据操作层,DAO属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议只做原子操作,增删改查。

  • service层:业务层,Service层是建立在DAO层之上的服务层,粗略的理解就是对一个或多个DAOj接口进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事务控制。具体要调用已经定义的多个dao层接口,封装service层业务逻辑有利于通用的业务逻辑的独立性和重复利用性。程序显得非常简洁。

  • control层:控制层处理业务流程的逻辑,负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。负责具体的业务模块流程的控制,在此层要调用service层的接口来控制业务流程。针对具体的业务流程,会有不同的控制器。

  • view层:显示层。(web项目中用到)

  • 区别:Controller,从字面上理解是控制器,所以它是负责业务调度的,所以在这一层应写一些业务的调度代码,而具体的业务处理应放在service中去写,而且service不单纯是对于dao的增删改查的调用,service是业务层,所以应该更切近于具体业务功能要求,所以在这一层,一个方法所体现的是一个可以对外提供的功能,比如购物商城中的生成订单方法,这里面就不简单是增加个订单记录那么简单,我们需要查询库存,核对商品等一系列实际业务逻辑的处理。

你可能感兴趣的:(go)