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

参考链接

最新文章

  1. 大话设计模式C++版——表驱动法改造简单工厂
  2. [Hibernate] - Annotations - One To Many
  3. NYOJ 51-管闲事的小明
  4. Ionic 安装部署
  5. 《Python 学习手册4th》 第十九章 函数的高级话题
  6. 通用链表实现(参考Linux List)
  7. FormsAuthenticationTicket学习笔记
  8. 看看国外的javascript题目,你能全部做对吗?(分享)
  9. 【JavaScript for循环实例】
  10. android 应用程序记录AAR
  11. jenkins修改数据存放路径
  12. mysql 获取昨天数据 utc时间
  13. 使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
  14. mysql数据表的基本操作:表结构操作,字段操作
  15. [JXOI2018]排序问题
  16. fastclick的介绍和使用
  17. zabbix在执行docker命令是报错
  18. sql server 查询某个表被哪些存储过程调用
  19. 第 8 章 容器网络 - 062 - 如何使用 flannel host-gw backend?
  20. root权限使用vim不能修改权限

热门文章

  1. Fortify Audit Workbench 笔记 Dynamic Code Evaluation: Code Injection
  2. Python os.fchdir() 方法
  3. PHP lcg_value() 函数
  4. PHP quoted_printable_encode() 函数
  5. Skill 脚本演示 ycNetToPin.il
  6. 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
  7. ABAP 动态备份自建表数据到新表(自建表有数据的情况下要改字段长度或者其他)
  8. 双下划线开头的attr方法
  9. Kaggle-pandas(2)
  10. 学会这些Python美图技巧,就等着女朋友夸你吧