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月前
|
缓存 JavaScript 前端开发
从零开始的抢购脚本开发-油猴开发教程(多快好省)
从零开始的抢购脚本开发-油猴开发教程(多快好省)
129 0
|
16天前
|
移动开发 网络协议 数据格式
【VOFA+速成】半小时入门VOFA+简明教程之基础认识(一)
【VOFA+速成】半小时入门VOFA+简明教程(一)
|
3月前
|
缓存 前端开发 Linux
哇塞!NPM 缓存竟成开发拦路虎?快来掌握清空秘籍,开启前端开发逆袭之旅!
【8月更文挑战第20天】NPM是前端开发中管理依赖的关键工具。有时需清空其缓存以解决版本不一致或包损坏等问题,确保使用最新依赖。可通过命令`npm cache clean --force`强制清空全部缓存,或手动删除各系统下的缓存文件夹。注意清空缓存可能延长后续安装时间,建议事先备份依赖或确保可重新安装。正确管理缓存有助于提升开发效率。
49 1
|
3月前
|
JSON 数据可视化 数据挖掘
Ruby 数据处理与分析竟如此强大!不看后悔一辈子,快来开启数据探索之旅!
【8月更文挑战第31天】在数据驱动时代,高效处理与分析数据至关重要。作为灵活强大的编程语言,Ruby 提供了丰富的工具和方法,涵盖数据读取、清洗、分析及可视化等多个环节。借助 CSV 和 JSON 库,可轻松处理常见文件格式;利用正则表达式清洗数据;通过 NMatrix 和 Statsample 库完成复杂的数据分析任务;使用 Gruff 库将分析结果可视化。同时,合理优化代码性能,如采用高效的数据结构和算法,能进一步提升数据处理效率。遵循这些最佳实践,Ruby 将成为你数据处理与分析的强大助手。
43 0
|
12月前
Axure快速入门(完结) -终章总结
Axure快速入门(完结) -终章总结
55 0
|
前端开发 JavaScript 程序员
重学JavaWeb第三天(十一)
重学JavaWeb第三天(十一)
80 0
|
前端开发
前端学习笔记202303学习笔记第五天-v-else和v-else-if
前端学习笔记202303学习笔记第五天-v-else和v-else-if
82 0
|
存储 供应链 安全
Java开发的五条安全小贴士,助你的项目更安全
Java开发的五条安全小贴士,助你的项目更安全
|
存储 NoSQL Java
GoFrame避坑指南和实践干货(2)
用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河
211 0
GoFrame避坑指南和实践干货(2)
|
数据库 数据格式 索引
GoFrame garray使用实践
今天在搞一个需求,从三方获得有信息变更的商品,更新自己的数据库,再推送给下游进行商品更新。
107 0
GoFrame garray使用实践