美文网首页Go程序员
Go语言与MySql数据库(下)——gorm框架

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

作者: 一梦千嬅 | 来源:发表于2018-12-26 16:44 被阅读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
    
    }
    

    相关文章

      网友评论

        本文标题:Go语言与MySql数据库(下)——gorm框架

        本文链接:https://www.haomeiwen.com/subject/vqahlqtx.html