暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

golang gorm 对mysql操作

Note2020 2021-07-29
515

gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。这里主要演示一下gorm的实际使用。



// 打开项目终端 安装gorm
go get -u gorm.io/gorm

链接数据库

    连接不同的数据库都需要导入对应数据的驱动程序,gorm的包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动就可以使用。


以mysql 为列

import (
  "github.com/jinzhu/gorm" // 引入gorm
   _"github.com/jinzhu/gorm/dialects/mysql" // 引入mysql  驱动
)

链接mysql



 // 链接数据库
db,err := gorm.Open("mysql","root:18482155682.@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local")
if err !=nil {
panic(err)
}
//最后关闭数据库
  defer db.Close() // 程序结束后关闭mysql 数据库


进行进行增删改查

// 列 简历一个用户表 进行c r u d 操作
// 声明一个user结构体
type User struct {
  ID int64
  Name string
  Gender string
}


func main(){
// 链接数据库
db,err := gorm.Open("mysql","root:18482155682.@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local")
if err !=nil {
panic(err)
}
  // gorm 自动迁移 会自动建立一张表
  db.Aut
   // 传递user 结构体指针 通过grom自动迁移 建表
  db.AutoMigrate(&User{})
  // 声明 变量进行 结构体赋值
  u1 := User{1,"坤坤","唱"}
  u2 := User{1,"caicai","跳"}
  // 创建一个数据行 == 插入一条数据
  // Create  grom 传递指针
  db.Create(&u1) // 将 u1 插入到数据库中
  db.Create(&u1) // 将 u2 插入到数据库中 
  // 查询一个数据  == 查询数据
  var u = new(User) // 实例化一个user 结构体 用来存储查询回来的数据
  db.First(u) // first 查第第一条数据 存储变量 u 中
  fmt.Printf("%#v\n", u) // 输出 查询出的的数据
  // 通过条件查询
  db.Find(u,"Gender=?","唱") // 查询字段   Gender 中符合条件的数据 
  
// 更新操作
    db.Model(&u).Update("Gender", "篮球") // 修改数据中 Gender 字段
    // 删除
    // 通过grom 中 delete 方法 进行物理删除
    db.Delete(&u)
   defer db.Close() // guanb
}

gorm model 的定义

算了不想写了  看代码吧

// grom model的定义 
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
2 : 嵌入到自己的模型中
// 将 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`字段注入到`User`模型中
type User struct {
gorm.Model
Name string
}

gorm  复杂查询

// 定义模型
type User struct {
ID int64
Name string
Age int64
}


user := User{Name: "大佬", Age: 18} // 模拟数据


db.Create(&user) // 插入数据
// 根据主键查询第一条记录 主键 默认等于id
db.First(&user)
// 通过 toke 在数据表user表中 随机获取一条记录
db.Take(&user)
// 根据主键查询表中最后一条记录
db.Last(&user)
// 查询表中所有的记录
db.Find(&user)
// 查询指定的某条记录(仅当主键为int类型时可用)
db.First(&user, 10) // 查询主键10


where 查询

// 查询表中 name 符合条件的 第一条数据
db.Where("name = ?", "大佬").First(&user)


 // 查询表中 name 符合条件的所有数据
db.Where("name = ?""大佬").Find(&user)


 // 查询表中 name 不符合条件的所有数据
db.Where("name <> ?", "jinzhu").Find(&user)


//条件查询
 db.Where(&user{Name"lc",Age19}).Find(&user)
 
 // 查询所有数据 但是返回的是指定的字段
 db.Select("name,age").Find(&user)
 // 指定一次查询多少条
 db.Limit(10).Find(&user)
 
//偏移  跳过多少条开始查询 ./ 组合Limit 进行分页查询
db.Offset(10).Find(&user)


 //分页查询 第一条开始查 查询 2条数据
 db.Offset(1).Limit(2).Find(&user)
 




简单的gorm crud 

学习 李老师的博客 https://www.liwenzhou.com/posts/Go/gorm_crud/


附上雪花算法 生成 递增 不重复分布式id

import (
"fmt"
"github.com/bwmarrin/snowflake"
"time"
)


/**
snowFlake 算法
雪花算法 他是twitter开源的有64位整数组成分布式id 性能较高 并且在单机上递增
*/
var node *snowflake.Node


func Init(startTime string, machineID int64) (err error) {
var st time.Time
st, err = time.Parse("2006-01-02", startTime) //自定义开始时间 和 结束时间
if err != nil {
return err
}
snowflake.Epoch = st.UnixNano() / 1000000 //设置一个毫秒值
node, err = snowflake.NewNode(machineID)
return nil
}


func Genid() (id int64, err error) {
//
if err := Init("2021-07-29", 1); err != nil {
fmt.Println("init failed,err :%v\n", err)
return 0, err
}
return node.Generate().Int64(), nil
}





文章转载自Note2020,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论