Go语言与MySql数据库(下)——gorm框架

  • 时间:2018-12-26 23:22 作者:一梦千嬅 来源:一梦千嬅 阅读:930
  • 扫一扫,手机访问
摘要:一、简介ORM(Object Relation Mapping),对象关系映射,实际上就是对数据库的操作进行封装,对上层开发人员屏蔽数据操作的细节,开发人员看到的就是一个个对象,大大简化了开发工作,提高了生产效率。二、 库安装go get -u [github.com/jinzhu/gorm (ht

一、简介

ORM(Object Relation Mapping),对象关系映射,实际上就是对数据库的操作进行封装,对上层开发人员屏蔽数据操作的细节,开发人员看到的就是一个个对象,大大简化了开发工作,提高了生产效率。

二、 库安装

go get -u [github.com/jinzhu/gorm (http://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)}}

四、数据库操作

1、创立表

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 设置少量额外的表属性。

2、插入

like := &Like{Ip: ip,……}if err := db.Create(like).Error; err != nil {return err}

先构造已给对象,直接调用 db.Create() 即可以插入一条记录了。

3、删除

if err := db.Where(&Like{Hash: hash}).Delete(Like{}).Error; err != nil {return err}

先用 db.Where() 构造查询条件,再调用 db.Delete() 即可以删除。

4、查询

var count interr := db.Model(&Like{}).Where(&Like{Ip: ip, Ua: ua, Title: title}).Count(&count).Errorif err != nil {return false, err}

先用 db.Model() 选择一个表,再用 db.Where() 构造查询条件,后面可以使用 db.Count() 计算数量,假如要获取对象,可以使用db.Find(&Likes) 或者者只要要查一条记录 db.First(&Like)。

5、修改

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

这几个例子来自于官网,第一个是升级单条记录;第二个是升级整条记录,注意只有非空字段才会升级;第三个例子是不会升级的,在系统设计的时候要尽量避免这些空值有特殊的含义,假如肯定要升级,可以使用第一种方式,设置单个值。

6、错误解决

其实你已经看到了,这里基本上所有的函数都是链式的,一律都返回 db 对象,任何时候调用 db.Error 就能获取到错误信息,非常方便。

7、事务的解决也很简单,用 db.Begin() 公告开启事务,结束的时候调用 tx.Commit(),异常的时候调用 tx.Rollback()。

8、其余还可以使用如下方式设置日志输出级别以及改变日志输出地方

db.LogMode(true)db.SetLogger(gorm.Logger{revel.TRACE})db.SetLogger(log.New(os.Stdout, "\r\n", 0))

五、实例分析

package mainimport ("fmt""time""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql")type Like struct {ID  int `gorm:"primary_key"`Ip  string `gorm:"type:varchar(20);not null;"`Ua  string `gorm:"type:varchar(256);not null;"`Title string `gorm:"type:varchar(128);not null;"`Hash  string `gorm:"unique_index:hash_idx"`CreateAt time.Time}var db_1 *gorm.DBfunc init() {var err errordb_1, err = gorm.Open("mysql", "root:12345678@/mydatabase?charset=utf8")if err != nil {panic(err)}}func main() {//创立表if err := db_1.CreateTable(&Like{}).Error; err != nil {panic(err)}//插入like := &Like{ID:  2,Ip:  "HHH",Ua:  "JJJ",Title: "Title",Hash:  "999",CreateAt: time.Now(),}if err := db_1.Create(like).Error; err != nil {fmt.Println(err)}//删除if err := db_1.Where(&Like{ID: 1}).Delete(Like{}).Error; err != nil {fmt.Println(err)}//查询1Query1()//查询2Query2()//遍历QueryAll()//升级Update()}//查询1func Query1() (bool, error) {var count int //查到的数量err := db_1.Model(&Like{}).Where(&Like{ID: 1}).Count(&count).Errorfmt.Println(count)if err != nil {return false, err}return false, err}//查询ID为1的Likefunc Query2() {var Likes Likedb_1.Model(&Like{}).Where(&Like{ID: 1}).Find(&Likes)fmt.Println(Likes)}//查询一律数据func QueryAll() {var tables []Likeerr := db_1.Where(&Like{}).Find(&tables)if err != nil {fmt.Println(err)}fmt.Println(tables)}//升级数据func Update() {db_1.Model(&Like{}).Where(Like{ID: 2}).Updates(Like{Ip: "Hello"}) //Model}
  • 全部评论(0)
最新发布的资讯信息
【系统环境|】2025含金量排名前十计算机专业证书(2025-10-15 20:51)
【系统环境|】你有白帽众测 我有黑帽雇佣(2025-10-15 20:50)
【系统环境|】印度理工学院成功开发出针对5G网络攻击的最新软件解决方案(2025-10-15 20:49)
【系统环境|】道德黑客与黑客教程(2025-10-15 20:49)
【系统环境|】苹果翻车!macOS 15 竟藏“后门”,黑客能直接偷你所有密码(2025-10-15 20:47)
【系统环境|】解密“被墙”玄学:为什么我的网络方案能做到长期稳定?(2025-10-15 20:46)
【系统环境|】NAS软路由/防火墙/网络安全需要注意哪些?如何保护你的网络设备(2025-10-15 20:45)
【系统环境|】你真的理解防火墙吗?(2025-10-15 20:44)
【系统环境|】苹果手机一键换机教程详解(2025-10-15 20:44)
【系统环境|】二手iPhone到手后怎么快速验机?(2025-10-15 20:43)
手机二维码手机访问领取大礼包
返回顶部