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

栏目: Go · 发布时间: 5年前

内容简介:• gorm创建的表结尾默认加s• 如果使用MySQL创建表,使用gorm进行增删查改注意字段名小写。• db.First获取第一条记录

开发人员友好的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查询条件

输出

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

更新数据

//更新数据
    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)

}

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入理解并行编程

深入理解并行编程

[美] Paul E.Mckenney(保罗·E·麦肯尼) / 谢宝友 鲁阳 / 电子工业出版社 / 2017-7-1 / 129

《深入理解并行编程》首先以霍金提出的两个理论物理限制为引子,解释了多核并行计算兴起的原因,并从硬件的角度阐述并行编程的难题。接着,《深入理解并行编程》以常见的计数器为例,探讨其不同的实现方法及适用场景。在这些实现方法中,除了介绍常见的锁以外,《深入理解并行编程》还重点介绍了RCU的使用及其原理,以及实现RCU的基础:内存屏障。最后,《深入理解并行编程》还介绍了并行软件的验证,以及并行实时计算等内容......一起来看看 《深入理解并行编程》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试