美文网首页Golang程序员
Golang学习笔记之Golang与Mysql交互二、gorm

Golang学习笔记之Golang与Mysql交互二、gorm

作者: 学生黄哲 | 来源:发表于2018-12-20 21:14 被阅读168次
    开发人员友好的ORM库。

    安装:go get -u github.com/jinzhu/gorm
    中文文档地址:http://gorm.book.jasperxu.com/
    GitHub地址:https://github.com/jinzhu/gorm

    • gorm创建的表结尾默认加s
    • 如果使用MySQL创建表,使用gorm进行增删查改注意字段名小写。

    数据库连接
    func init() {
        var err error
        //第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
        db, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
        if err != nil {
            panic(err)
        }
    }
    
    创建表
    package main
    
    import (
    
        _ "github.com/go-sql-driver/mysql"
        "github.com/jinzhu/gorm"
    )
    
    //Test 表
    type Test struct {
        ID        int    `gorm:"primary_key"`
        Name      string `gorm:"type:varchar(128);unique_index:hash_idx"`
        Password  string
    }
    
    var db *gorm.DB
    
    func init() {
        var err error
        //第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
        db, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
        if err != nil {
            panic(err)
        }
    }
    func main() {
        //创建表
        if !db.HasTable(&Test{}) {
            if err := db.CreateTable(&Test{}).Error; err != nil {
                panic(err)
            }
        }
    }
    
    插入
        //插入数据
        Test := &Test{
            ID:       1,
            Name:     "黄哲",
            Password: "123",
        }
        if err := db.Create(Test).Error; err != nil {
            fmt.Println(err)
            return
        }
    
    删除
    //删除数据,where匹配条件,然后删除,链式调用
        if err := db.Where("ID = ?",1).Delete(Test{}).Error; err != nil {
            fmt.Println(err)
            return
        }
    
    查询
        var count int
        var count1 int
        var test Test
        var test1 []Test
        //Where匹配条件,Find指定表,Count获取数量,获取单个匹配的数据时
        db.Where("id = ?", 2).Find(&Test{}).Count(&count)
        //Model指定表,Where匹配条件,count获取数量,多个字段可以匹配时
        db.Model(&Test{}).Where("id > ?", 1).Count(&count1)
        //Scan会将查找到的数据写入test中
        db.Where("id = ?", 1).Find(&Test{}).Scan(&test)
        db.Model(&Test{}).Where("id > ?", 1).Scan(&test1)
        fmt.Println(count)
        fmt.Println(count1)
        fmt.Println(test)
        fmt.Println(test1)
    

    • db.First获取第一条记录
    • db.Where查询条件

    输出


    更新数据
        //更新数据
        db.Model(&Test{}).Where("id = ?", 1).Updates(Test{Password: "112323"})
    
    错误处理

    所有的函数都是链式的,全部都返回 db 对象,任何时候调用 db.Error 就能获取到错误信息,例如上面的更新数据

     err := db.Model(&Test{}).Where("id = ?", 1).Updates(Test{Password: "112323"}).Error
    
    事务处理
    package main
    
    import (
        _ "github.com/go-sql-driver/mysql"
        "github.com/jinzhu/gorm"
    )
    
    //Animal 表
    type Animal struct {
        ID   int
        Name string
    }
    
    var db1 *gorm.DB
    
    func init() {
        var err error
        //第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
        db1, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
        if err != nil {
            panic(err)
        }
    }
    func main() {
        CreateAnimals(db1)
    
    }
    func CreateAnimals(db *gorm.DB) error {
        //开启事务
        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
    }
    

    demo

    package main
    import (
        "fmt"
    
        _ "github.com/go-sql-driver/mysql"
        "github.com/jinzhu/gorm"
    )
    //Test 表
    type Test struct {
        ID       int    `gorm:"primary_key"`
        Name     string `gorm:"type:varchar(128);unique_index:hash_idx"`
        Password string
    }
    var db *gorm.DB
    func init() {
        var err error
        //第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
        db, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
        if err != nil {
            panic(err)
        }
    }
    func main1() {
        //创建表
        if !db.HasTable(&Test{}) {
            if err := db.CreateTable(&Test{}).Error; err != nil {
                panic(err)
            }
        }
        // //插入数据
        // Te := &Test{
        //  ID:       6,
        //  Name:     "王五",
        //  Password: "123",
        // }
        // if err := db.Create(Te).Error; err != nil {
        //  fmt.Println(err)
        // }
    
        // //删除数据,where匹配条件,然后删除,链式调用
        // if err := db.Where("ID = ?",1).Delete(Test{}).Error; err != nil {
        //  fmt.Println(err)
        // }
    
        //查询数据
        var count int
        var count1 int
        var test Test
        var test1 []Test
        //Where匹配条件,Find指定表,Count获取数量,获取单个匹配的数据时
        db.Where("id = ?", 2).Find(&Test{}).Count(&count)
        //Model指定表,Where匹配条件,count获取数量,多个字段可以匹配时
        db.Model(&Test{}).Where("id > ?", 1).Count(&count1)
        //Scan会将查找到的数据写入test中
        db.Where("id = ?", 1).Find(&Test{}).Scan(&test)
        db.Model(&Test{}).Where("id > ?", 1).Scan(&test1)
        fmt.Println(count)
        fmt.Println(count1)
        fmt.Println(test)
        fmt.Println(test1)
    
        // //更新数据
        // err := db.Model(&Test{}).Where("id = ?", 1).Updates(Test{Password: "112323"}).Error
        // fmt.Println(err)
    
    }
    

    更多使用可以看中文文档,博文开头有

    相关文章

      网友评论

        本文标题:Golang学习笔记之Golang与Mysql交互二、gorm

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