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不断增长,导致后续事务超时.


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

目录
相关文章
|
2月前
|
消息中间件 安全 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
59 0
|
10月前
|
Kubernetes Java 数据库
GitHub置顶神作开源!世界名著《Spring实战(第6版)》全彩文档
今天给大家带来的是:[美] 克雷格·沃斯(Craig Walls) 著,张卫滨,吴国浩 译的 《Spring实战(第6版)》,也是最新的一版,本书是关于Spring核心特性的指南,延续了前几个版本一贯的清晰风格,带领你亲自动手,逐步构建出一个以数据库作为支撑的Web应用。
|
2月前
|
前端开发 JavaScript Java
一款神仙级SpringCloud微服务开源项目,接私活吊到不行!(附源码)
一个由商业级项目升级优化而来的微服务架构,采用SpringBoot 2.7 、SpringCloud 等核心技术构建,提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。
一款神仙级SpringCloud微服务开源项目,接私活吊到不行!(附源码)
|
2月前
|
XML SQL Java
Spring保姆级丝滑教程(一文搞懂系列)(2)
Spring保姆级丝滑教程(一文搞懂系列)
126 0
|
2月前
|
XML Java 数据格式
Spring保姆级丝滑教程(一文搞懂系列)(1)
Spring保姆级丝滑教程(一文搞懂系列)
|
前端开发 Java 数据库
SpringBoot日记本系统全程直播01:先把框架搞起来撒~~
SpringBoot日记本系统全程直播01:先把框架搞起来撒~~
114 0
|
SQL 前端开发 Java
【五一创作】基于springboot框架的电脑商城项目(三)(1)
个人资料 (一)个人资料(持久层) 1.规划sql 根据用户id修改信息的SQL语句
|
SQL 存储 JSON
【五一创作】基于springboot框架的电脑商城项目(三)-2
个人资料 (一)个人资料(持久层) 1.规划sql 根据用户id修改信息的SQL语句
|
Java 关系型数据库 MySQL
兑现承诺,给粉丝专门搞了一个SpringBoot2.x整合hibernate5的教程,附带视频+源码,免费下载!
兑现承诺,给粉丝专门搞了一个SpringBoot2.x整合hibernate5的教程,附带视频+源码,免费下载!
|
存储 NoSQL Java
GoFrame避坑指南和实践干货(2)
用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河
174 0
GoFrame避坑指南和实践干货(2)