golang gorm 基本使用
原文链接:golang orm 框架之 gorm
gorm 用法介绍
库安装
go get -u github.com/jinzhu/gorm
数据库连接
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
) var db *gorm.DB func init() {
var err error
db, err = gorm.Open("mysql", "<user>:<password>/<database>?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
}
连接比较简单,直接调用 gorm.Open
传入数据库地址即可
github.com/jinzhu/gorm/dialects/mysql
是 golang 的 mysql 驱动,实际上就是 github.com/go-sql-driver/mysql
作者这里为了好记,重新弄了个名字
这里我用的 mysql,实际上支持基本上所有主流的关系数据库,连接方式上略有不同
db.DB().SetMaxIdleConns()
db.DB().SetMaxOpenConns()
还可以使用 db.DB()
对象设置连接池信息
表定义
先来定义一个点赞表,这里面一条记录表示某个用户在某个时刻对某篇文章点了一个赞,用 ip + ua 来标识用户,title 标识文章标题
type Like struct {
ID int `gorm:"primary_key"`
Ip string `gorm:"type:varchar(20);not null;index:ip_idx"`
Ua string `gorm:"type:varchar(256);not null;"`
Title string `gorm:"type:varchar(128);not null;index:title_idx"`
Hash uint64 `gorm:"unique_index:hash_idx;"`
CreatedAt time.Time
}
gorm 用 tag 的方式来标识 mysql 里面的约束
创建索引只需要直接指定列即可,这里创建了两个索引,ip_idx
和 title_idx
;如果需要多列组合索引,直接让索引的名字相同即可;如果需要创建唯一索引,指定为 unique_index
即可
支持时间类型,直接使用 time.Time
即可
创建表
if !db.HasTable(&Like{}) {
if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Like{}).Error; err != nil {
panic(err)
}
}
直接通过 db.CreateTable
就可以创建表了,非常方便,还可以通过 db.Set
设置一些额外的表属性
插入
like := &Like{
Ip: ip,
Ua: ua,
Title: title,
Hash: murmur3.Sum64([]byte(strings.Join([]string{ip, ua, title}, "-"))) >> ,
CreatedAt: time.Now(),
} if err := db.Create(like).Error; err != nil {
return err
}
先构造已给对象,直接调用 db.Create()
就可以插入一条记录了
删除
if err := db.Where(&Like{Hash: hash}).Delete(Like{}).Error; err != nil {
return err
}
先用 db.Where()
构造查询条件,再调用 db.Delete()
就可以删除
查询
var count int
err := db.Model(&Like{}).Where(&Like{Ip: ip, Ua: ua, Title: title}).Count(&count).Error
if err != nil {
return false, err
}
先用 db.Model()
选择一个表,再用 db.Where()
构造查询条件,后面可以使用 db.Count()
计算数量,如果要获取对象,可以使用 db.Find(&Likes)
或者只需要查一条记录 db.First(&Like)
修改
db.Model(&user).Update("name", "hello")
db.Model(&user).Updates(User{Name: "hello", Age: })
db.Model(&user).Updates(User{Name: "", Age: , Actived: false}) // nothing update
我这个系统里面没有更新需求,这几个例子来自于官网,第一个是更新单条记录;第二个是更新整条记录,注意只有非空字段才会更新;第三个例子是不会更新的,在系统设计的时候要尽量避免这些空值有特殊的含义,如果一定要更新,可以使用第一种方式,设置单个值
错误处理
其实你已经看到了,这里基本上所有的函数都是链式的,全部都返回 db
对象,任何时候调用 db.Error
就能获取到错误信息,非常方便
事务
func CreateAnimals(db *gorm.DB) err {
tx := db.Begin()
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
tx.Rollback()
return err
}
tx.Commit()
return nil
}
事务的处理也很简单,用 db.Begin()
声明开启事务,结束的时候调用 tx.Commit()
,异常的时候调用 tx.Rollback()
其他
还可以使用如下方式设置日志输出级别以及改变日志输出地方
db.LogMode(true)
db.SetLogger(gorm.Logger{revel.TRACE})
db.SetLogger(log.New(os.Stdout, "\r\n", ))
也支持普通的 sql,但是建议尽量不要使用
参考链接
- gorm 官方文档: http://gorm.io/
- gorm github: https://github.com/jinzhu/gorm
golang gorm 基本使用的更多相关文章
- golang gorm框架的默认时区问题
gorm框架的时区是在连接数据库时设置的, 如下
- Golang Gorm time 时间字段格式化模型类 重写
问题: 在使用GORM中 如果我们使用到了CreateAt 和UpdateAt 就会发现 这个时间的类型是time.Time 而其数据是 "2022-10-13T10:14:02.97352 ...
- gin框架使用orm操作数据库(转)
简介:orm俗称关系对象模型,用来映射数据库SQL和对象的工具 ,相当于mongodb里面的mongoose库,Java里面的mybatis ibatis Golang GORM使用 https: ...
- go操作mysql数据库
Golang GORM使用 gorm gorm是go语言中实现数据库访问的ORM(对象关系映射)库.使用这个库,我们可以利用面向对象的方法,更加方便的对数据库中的数据进行CRUD(增删改查). 基本使 ...
- Golang 入门系列(十二)ORM框架gorm
之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...
- [开源]Gin + GORM + Casbin+vue-element-admin 实现权限管理系统(golang)
简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...
- golang中使用gorm连接mysql操作
一.代码 package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/go- ...
- Go语言(golang)开源项目大全
转http://www.open-open.com/lib/view/open1396063913278.html内容目录Astronomy构建工具缓存云计算命令行选项解析器命令行工具压缩配置文件解析 ...
- [转]Go语言(golang)开源项目大全
内容目录 Astronomy 构建工具 缓存 云计算 命令行选项解析器 命令行工具 压缩 配置文件解析器 控制台用户界面 加密 数据处理 数据结构 数据库和存储 开发工具 分布式/网格计算 文档 编辑 ...
随机推荐
- 启动扫描闪退,因为忘了在manifest里申请手机镜头使用许可了。
启动扫描闪退,因为忘了在manifest里申请手机镜头使用许可了.
- PHP设计模式之----观察者模式
一.概述 1.观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新. 2.场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后 ...
- Java容器学习之ArrayList
一.概述 ArrayList是java中十分常用的集合类,继承于AbstractList,并实现了List.RandomAccess.Cloneable和Serializable接口.ArrayLis ...
- jmeter跨线程组session保持
@@@@@@@@@@@@@@@ 是金子早晚会被挖光的 http请求由于无状态的特性,所以在请求时需要带上身份信息,关于session和cookie的验证机制会在其他笔记中再记录,这里不讨论. 心路历程 ...
- oracle SCN推进恢复数据库 简单记录
由于是在内网专用机器上操作,没有日志记录,下面做个简单记录: 前几天某供电局的的一个老数据库存储挂了,数据全部丢失,该库没有开归档,没接备份,怎么恢复? 由于存储损坏严重,从存储恢复不好搞. 好在 ...
- 让内层浮动的Div将外层Div撑开 -----清浮动
清浮动的好处写多了都能体会到,解决高度塌陷, 一般情况下是要清除浮动的,不然会影响下面标签的排版. <div class="parent" style="width ...
- vue脚手架创建项目名字报错
vue inti webpack TimeManger 报错 Sorry, name can no longer contain capital letters 原来这个capital是大写的意思,上 ...
- 重学c#系列——异常(六)
前言 用户觉得异常是不好的,认为出现异常是写的人的问题. 这是不全面,错误的出现并不总是编写程序的人的原因,有时会因为应用程序的最终用户引发的动作或运行代码的环境而发生错误,比如你用android4去 ...
- Centos xrdp 远程连接后突然闪退
问题描述: 可以进入登录页面,但是输入用户名,密码后,直接闪退. 查看 该用户名 ~/.xsession-errors imsettings-check: ): IMSettings-WARNING ...
- Spring与Mybatis整合占位符无法解析问题
问题:写了一个新的dao接口,进行单元测试时提示: Initialization of bean failed; nested exception is org.springframework.bea ...