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


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

目录
相关文章
|
传感器 机器学习/深度学习 数据采集
AI在环保中的角色:污染监测与防治
【10月更文挑战第6天】AI在环保领域的应用,不仅提升了污染监测的精准度和防治效率,还推动了环保技术的创新和升级。作为未来环保事业的重要力量,AI正以其独特的优势,为构建更加绿色、可持续的生态环境贡献着智慧与力量。我们有理由相信,在AI的助力下,我们的地球将变得更加美好。
1216 3
|
存储 Prometheus 监控
Centos7.X 搭建Prometheus+node_exporter+Grafana实时监控平台(上)
Centos7.X 搭建Prometheus+node_exporter+Grafana实时监控平台(上)
550 0
Centos7.X 搭建Prometheus+node_exporter+Grafana实时监控平台(上)
|
机器学习/深度学习 人工智能 数据可视化
【文章阅读】Frustratingly Simple Few-Shot Object Detection
从几个例子中检测稀有物体是一个新出现的问题。先前的研究表明,元学习是一种很有前途的方法。但是,微调技术几乎没有引起人们的注意。我们发现,仅对稀有类现有检测器的最后一层进行微调对于少镜头目标检测任务是至关重要的。在当前的基准测试中,这种简单的方法比元学习方法高出大约2~20个百分点,有时甚至会使以前的方法的准确率翻一番。
735 0
|
消息中间件 存储 Kafka
浅谈现代消息队列与云存储
讲述消息系统在现代化演进中软硬一体化,百万队列,分级存储等诸多竞争力特性的诞生和落地效果。探讨业界领先的 Shared-Log 存储计算分离,FFM与协程,RDMA 传输,列式存储等技术,将消息向流的领域延伸。
|
前端开发 JavaScript 容器
你知道css中的object-fit的用法吗?
你知道css中的object-fit的用法吗?
686 0
|
定位技术 文件存储 网络架构
Docker部署PhotoPrism、Immich图片管理应用,无需公网IP远程访问教程
除了Synology、QNAP、TerraMaster等品牌的NAS设备内置图库功能,市面上还有多种备受欢迎的第三方应用,如PhotoPrism、Immich、LibrePhotos、Piwigo、Photoview等。这些应用不仅提供强大的图片管理能力,还可通过Docker轻松部署。借助贝锐花生壳服务,即使没有公网IP也能实现远程访问,突破地理限制,提升数据可访问性和安全性,让用户随时随地管理私人图库。
2630 1
|
人工智能 搜索推荐 IDE
MCP 是什么?一文看懂模型上下文协议
MCP(模型上下文协议)由Anthropic于2024年推出,旨在解决AI大模型的数据滞后问题,通过连接第三方数据源提升回答的时效性和相关性。传统联网搜索依赖公开信息,难以满足行业内部或定制化需求。MCP提供统一标准,使开发者能安全双向连接数据源与AI工具,简化集成流程。例如,Apifox MCP Server可将API文档作为数据源提供给支持MCP的IDE,助力智能代码生成。未来,MCP有望推动AI工具从封闭系统转向开放协作网络,显著提升开发效率与创新能力。
|
JSON Java Android开发
Android.bp 文件中引入aar、jar、so库正确编译方法(值得收藏)
Android.bp 文件中引入aar、jar、so库正确编译方法(值得收藏)
5018 0
|
10月前
|
运维 Kubernetes Cloud Native
K8s
Kubernetes,源自Google的开源容器编排平台,被誉为数字时代的“隐形操作系统”。它以声明式API和控制器模式为核心,实现应用的自动化部署、扩缩容与自愈,支撑全球企业云原生转型。从微服务到AI、边缘计算,K8s正构建统一的分布式应用基石,重塑软件交付与运维范式,成为数字化世界的底层引擎。(238字)
|
弹性计算
阿里云服务器公网IP和内网IP查询方法
阿里云服务器公网IP和内网IP查询方法
2071 0

热门文章

最新文章