Go程序员

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

2018-12-26  本文已影响20人  一梦千嬅

一、简介

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.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)
}
}

四、数据库操作

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 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)。

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 main

import (

"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.DB

func init() {

var err error

db_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)

}

//查询1

Query1()

//查询2

Query2()

//遍历

QueryAll()

//更新

Update()

}

//查询1

func Query1() (bool, error) {

var count int //查到的数量

err := db_1.Model(&Like{}).Where(&Like{ID: 1}).Count(&count).Error

fmt.Println(count)

if err != nil {

return false, err

}

return false, err

}

//查询ID为1的Like

func Query2() {

var Likes Like

db_1.Model(&Like{}).Where(&Like{ID: 1}).Find(&Likes)

fmt.Println(Likes)

}

//查询全部数据

func QueryAll() {

var tables []Like

err := 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

}
上一篇下一篇

猜你喜欢

热点阅读