GoFrame第五天

简介: GoFrame第五天

GoFrame day5


前言


有了客户端与服务端的请求和处理之后,我们还需要完成一些其他的功能,比如数据库交互,国际化服务,资源管理,分页管理


今天就来学习一下重要的数据库交互相关内容,说到底大多数服务也只是对数据库进行增删改查.在GoFramev2.1之后数据库驱动都需要手动引入,相关的操作可以去看看这里github.com/gogf/gf/tre…


ORM


GoFrame的ORM功能使用gdb模块实现,采用了链接池设计所以会自动关闭不再需要手动关闭.


使用配置


首先连接数据库需要设置数据库类型,数据库名,数据库链接(用户名,密码…),和之前的配置文件类似,同样可以在config.yaml中设置这些参数


增删改查相关


一般常用的数据库操作可以使用GoFrame支持的ORM链式操作,但是默认情况下gdb都不是链式安全的,也就是说每一个方法都会对当前的Model进行修改,不能重复使用.我们也可以手动调用Clone来克隆当前的模型,创建一个新的模型来实现链式安全.也可以设置Safe设置当前为链式安全的,不过每一次操作都需要使用变量赋值来覆盖原始模型.

对于较为复杂不好组合的查询或者操作,则可以选择使用原生的数据库操作来实现.下面就来看看一些例子(以插入insert为例)


package main
import (
  "fmt"
  "github.com/gogf/gf/v2/os/gctx"
  "github.com/gogf/gf/v2/frame/g"
)
type User struct {
  Uid  int    `orm:"uid"`
  Name string `orm:"name"`
  Site string `orm:"site"`
}
func main() {
  user := &User{
    Uid:  1,
    Name: "john",
    Site: "https://goframe.org",
  }
  db := g.DB()
  var ctx = gctx.New()
  g.Model("user").Data(user).Insert()
  _, err := db.Insert(ctx, "user", g.Map{
    "name": "bbb",
  })
  if err != nil {
    println(err)
  }
  g.Model("user").Data(g.Map{
    "name": "ccc",
  }).Insert()
  g.Model("user").Data(g.Map{
    "name": "ddd",
  }).Insert()
  //数量
  count, err := g.DB().Model("user").Where("uid", 10001).Count()
  if err != nil {
    panic(err)
  }
  fmt.Println("count:", count)
  //获取单个值
  v, err := g.DB().Model("user").Where("uid", 10000).Fields("name").Value()
  if err != nil {
    panic(err)
  }
  fmt.Println("name:", v.String())
  // 查询对象
  r, err := g.DB().Model("user").Where("uid", 10001).One()
  if err != nil {
    panic(err)
  }
  fmt.Println("name:", r.Map()["name"])
  // 查询对象
  //l, err := g.DB().Model("user").As("t").Where("t.uid > ?", 10000).All()
  // 也可以简写为 select * from user as t where t.uid > 10000
  l, err := g.DB().Model("user").As("t").All("t.uid > ?", 10000)
  if err != nil {
    panic(err)
  }
  for index, value := range l {
    fmt.Println(index, value["uid"], value["name"])
  }
  //g.DB().Model("user").Where("uid", 10001).Delete()
  //g.DB().Model("user").Where("uid", 10002).Delete()
}
复制代码


对于简单的操作,可以使用g.Model()调用链式方法,默认Model使用的是config.yaml中default的设置,我的配置如下:


image.png


debug可以让我们看到每一行语句是否成功,dryrun: 0不会让我们只读不写,其他设置都是数据库连接相关,当然也可以添加log方便以后检查.


从代码看我们添加数据有好几种方式:

  • 链式添加一个实体对象
  • 链式添加一个g.Map{}封装的数据
  • 原生方式添加一个数据


image.png


其他操作,如查询删除等等都可以仿照这份代码里的操作进行


事务与闭包


常规的事务操作方法为Begin/Commit/Rollback,先用Begin开启事务返回一个事务的操作对象;然后对操作对象进行后续数据库操作,利用Commit提交事务,如果存在错误就使用Callback回滚.但是开启事务之后一定要记得进行事务的提交或者回滚,否则会导致goroutine不断增长,导致后续事务超时.


为了防止我们忘记提交或者回滚,所以建议使用闭包操作处理事务.当给定的闭包方法没有错误的时候会自动执行提交事务,反之则会回滚事务.

目录
相关文章
|
6月前
|
消息中间件 安全 druid
GitHub昙花一现!《Spring Boot趣味实战课》神作开源几分钟被下架
今天给大家分享好书了:刘水镜老师的 《Spring Boot趣味实战课》,网上依旧是没有开源版本!小编会在文末附电子版免费下载方式。 刘水镜是谁? 十余年持续技术文章输出,CSDN博客专家。2020年《 Spring Boot趣味私房课》专栏上线,凭借风趣幽默、深入浅出的写作风格深受读者好评。 《Spring Boot趣味实战课》 内容丰富、趣味实战是本书的两大特色 涵盖 Spring MVC、MyBatis Plus、Spring DaJPA、Spring Security、Quartz等主流框架 整合MySQL. Druid、Redis、 RabbitMQ、Elastics
103 0
|
XML 监控 数据可视化
马老师力荐:腾讯SpringBoot高阶笔记,限时开源48小时
众所周知,SpringBoot最大的一个优势就是可以进行自动化配置,简化配置,不需要编写太多的xml配置文件;基于Spring构建,使开发者快速入门,门槛很低;SpringBoot可以创建独立运行的应用而不需要依赖于容器;内置tomcat服务器,不需要打包成war包,可以直接放到tomcat中运行;提供maven极简配置,以及可视化的相关监控功能,比如性能监控,应用的健康程度等;为微服务SpringCloud奠定了基础,使得微服务的构建变得简单;Spring可以整合很多各式各样的框架,并能很好的集成。
|
SQL 前端开发 Java
【五一创作】基于springboot框架的电脑商城项目(三)(1)
个人资料 (一)个人资料(持久层) 1.规划sql 根据用户id修改信息的SQL语句
|
前端开发
前端学习笔记202303学习笔记第五天-v-else和v-else-if
前端学习笔记202303学习笔记第五天-v-else和v-else-if
82 0
|
程序员 编译器 C++
c++第十一篇
c++第十一篇
|
小程序 定位技术 API
幼儿园小程序实战开发教程(终篇)
幼儿园小程序实战开发教程(终篇)
幼儿园小程序实战开发教程(终篇)
|
存储 NoSQL Java
GoFrame避坑指南和实践干货(2)
用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河
220 0
GoFrame避坑指南和实践干货(2)
|
数据库 数据格式 索引
GoFrame garray使用实践
今天在搞一个需求,从三方获得有信息变更的商品,更新自己的数据库,再推送给下游进行商品更新。
111 0
GoFrame garray使用实践
GoFrame第四天
GoFrame第四天
227 0
GoFrame第四天
|
中间件 API
GoFrame第三天
GoFrame第三天
235 0
GoFrame第三天