原文链接: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.DBfunc init() {var err errordb, 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(10)
db.DB().SetMaxOpenConns(100)

还可以使用 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}, "-"))) >> 1,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: 18})
db.Model(&user).Updates(User{Name: "", Age: 0, 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", 0))

也支持普通的 sql,但是建议尽量不要使用

参考链接

  • gorm 官方文档: http://gorm.io/
  • gorm github: https://github.com/jinzhu/gorm

转载于:https://www.cnblogs.com/wangjq19920210/p/11512893.html

golang gorm 基本使用相关推荐

  1. golang gorm增删改查db.Model db.Where db.Table

    1. 创建 创建记录: user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}db.NewRecord(user) ...

  2. Golang GORM 详解

    学习目标: 1. GORM 介绍 2. GORM 使用 学习内容: 1 GORM介绍 GORM 是基于 Go 语言的 ORM 库,可使开发者对数据库使用更为方便,支持多种数据库. 它提供了许多功能,例 ...

  3. golang Gorm框架

    1.gorm介绍 1.1介绍 全功能 ORM 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承) Create,Save,Update,Dele ...

  4. Golang gorm 常用新增方法

    文章目录 前言 插入 批量插入 按批次插入 关联保存(has one) 关联保存 (has many) 多对多关联保存 (many to many) 零值(0,'',false)新增问题 前言 数据库 ...

  5. goland gorm分组查询统计_golang gorm 计算字段和获取sum()值的实现

    计算表lb_ytt_user_money_log 中,字段money的和 代码如下: var total_money []int sqlstr := `select SUM(money) as tot ...

  6. gorm.open mysql_golang gorm 操作mysql及gorm基本用法

    golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍 下载gorm: go get -u github.com/jinzhu/gorm 在项目中引入g ...

  7. 【GORM框架】ORM介绍、GORM简单连接和高级配置详解

    博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作.目前在学习和分享:数据结构.Go,Java等相关知识. 博主主页: @是瑶瑶子啦 所属专栏: GORM框架学习 近期目标:写好专栏的每一篇文 ...

  8. 【gin学习笔记】07初识GROM使用GORM进行数据库操作

    本文学习视频https://www.bilibili.com/video/BV1Bz411v78U/?spm_id_from=333.788 gorm中文官方文档 https://jasperxu.c ...

  9. golang orm 框架之 gorm

    最近在想给这个小站增加点赞和评论功能,第三方系统又有各种限制,就想自己弄个后端,实现类似的功能,对于个人来说,数据量不是很大,单机的 mysql 足够存下所有数据,mysql 作为底层存储是个不错的选 ...

最新文章

  1. java 线程通讯_java多线程(五)线程通讯
  2. Swift中依赖注入的解耦策略
  3. WinCvs 操作参考手册
  4. 妙用 Intellij IDEA 创建临时文件,Git 跟踪不到的那种
  5. springmvc学习资料整理
  6. SAP Control Framework 丢失事件?
  7. 使用GitLab CI和Docker进行容器应用自动化部署
  8. Asp.Net就业课之三验证控件
  9. SylixOS中select原理及使用分析
  10. 【新用户专享】腾讯云发车,360元三年1核2G云服务器
  11. 【队列+模拟】机器翻译 luogu-1540
  12. 面试常问:BIO,NIO,AIO
  13. ERP采购管理 金蝶
  14. 计算机技术检索,计算机检索常用技术.ppt
  15. 计算机内存128毫升,内存128.1M的微信怎么可能只能聊天!
  16. matlab实现螺旋谱分解,MATLAB实现EMD分解及希尔伯特谱分析
  17. 利用 0DAY 漏洞 CVE-2018-8174 获取windows系统 shell
  18. m3u8视频下载转为mp4
  19. 谈谈Java的学习方法
  20. 美团CAT客户端接入方式

热门文章

  1. Validate使用及配置
  2. 八代i7装服务器系统2012,八代I7能装win7系统吗,会影响性能吗-8代win7,8代cpu完美装win7...
  3. Java 改变cmd颜色_9 个小技巧让你的 if else 看起来更优雅!
  4. 爬虫python爬取页面请求_03 Python网络爬虫第三弹《爬取get请求的页面数据》,urllib...
  5. ubuntu16.04无法连接WiFi搜索不到网络网卡驱动
  6. junit 测试似有方法_Spring整合Junit的使用
  7. html自动刷新 idea_IDEA设置热部署
  8. oracle sql developer sid,登录 Oracle SQL Developer
  9. java jsch 密钥登陆_我们可以使用JSch进行基于SSH密钥的通信吗?
  10. linux 备份文件