原文链接: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,但是建议尽量不要使用

参考链接

golang gorm 基本使用的更多相关文章

  1. golang gorm框架的默认时区问题

    gorm框架的时区是在连接数据库时设置的, 如下

  2. Golang Gorm time 时间字段格式化模型类 重写

    问题: 在使用GORM中 如果我们使用到了CreateAt 和UpdateAt 就会发现 这个时间的类型是time.Time 而其数据是 "2022-10-13T10:14:02.97352 ...

  3. gin框架使用orm操作数据库(转)

      简介:orm俗称关系对象模型,用来映射数据库SQL和对象的工具 ,相当于mongodb里面的mongoose库,Java里面的mybatis ibatis Golang GORM使用 https: ...

  4. go操作mysql数据库

    Golang GORM使用 gorm gorm是go语言中实现数据库访问的ORM(对象关系映射)库.使用这个库,我们可以利用面向对象的方法,更加方便的对数据库中的数据进行CRUD(增删改查). 基本使 ...

  5. Golang 入门系列(十二)ORM框架gorm

    之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...

  6. [开源]Gin + GORM + Casbin+vue-element-admin 实现权限管理系统(golang)

    简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...

  7. golang中使用gorm连接mysql操作

    一.代码 package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/go- ...

  8. Go语言(golang)开源项目大全

    转http://www.open-open.com/lib/view/open1396063913278.html内容目录Astronomy构建工具缓存云计算命令行选项解析器命令行工具压缩配置文件解析 ...

  9. [转]Go语言(golang)开源项目大全

    内容目录 Astronomy 构建工具 缓存 云计算 命令行选项解析器 命令行工具 压缩 配置文件解析器 控制台用户界面 加密 数据处理 数据结构 数据库和存储 开发工具 分布式/网格计算 文档 编辑 ...

随机推荐

  1. sed 指定行范围匹配

    sed -n '5,10{/pattern/p}' file sed是一个非交互性性文本编辑器,它编辑文件或标准输入 导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文 ...

  2. phpbasic

    <!DOCTYPE html> <html> <body> <?php // 这是 PHP 单行注释 /* 这是 PHP 多行 注释 */ ?> < ...

  3. SpringSecurity匹配规则介绍

    SpringSecurity匹配规则一 URL匹配 requestMatchers() 配置一个request Mather数组,参数为RequestMatcher 对象,其match 规则自定义,需 ...

  4. Django学习路18_F对象和Q对象

    F 对象: 可以使用模型的 A 属性和 B 属性进行比较 写法: 需要的数据对象 = 数据表(类名).objects.filter(列名__条件=F('列名2')) 需求: 查看男生数量比女生少 的公 ...

  5. FGPA_Microblaze UART 中断

    由于底层所给函数发送与接收都采用中断,所用库函数比较复杂 ,有些更改涉及底层函数,因此结合网上论坛 .百度文库调试了串口中断接收程序.通过串口调试助手发送数据 ,以“发送新行”结束 . 硬件外设波特兰 ...

  6. PDOStatement::columnCount

    PDOStatement::columnCount — 返回结果集中的列数.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 int PDOStateme ...

  7. VMware 虚拟机开机黑屏解决方法

    # 调整VMware硬盘启动优先级 第一步:打开电源时进入固件,也就是BIOS 设置界面. 第二步:找到Main-最下面的Boot-time Diagnostic Screen,敲“Enter”,弹出 ...

  8. Linux搭建Gitlab(Docker版)

    1.拉取gitlab的docker镜像 #这里使用gitlab的社区版 docker pull gitlab/gitlab-ce 2.启动gitlab容器实例 docker run -d  -p 44 ...

  9. Use SQL to Query Data from CDS and Dynamics 365 CE

    from : https://powerobjects.com/2020/05/20/use-sql-to-query-data-from-cds-and-dynamics-365-ce/ Have ...

  10. .Net小白的第一篇博文

    说起来也比较惭愧,5个月之前,我早已创建了博客园账号,那时候的我雄心壮志,给自己定下了 很多目标.现在回想起来,除了体重的增长,头发的稀疏,似乎这段时间的消逝并没有带给我什么见识上的成长.哈哈,想必大 ...