go mysql包,Go语言操作mysql的第三方包 gorm

本文详细介绍了Go语言中使用GORM库操作MySQL数据库的方法,包括连接池配置、表结构操作、数据增删改查、索引管理等。通过示例代码展示了如何进行数据库连接、数据迁移、查询过滤等常见操作,帮助开发者更好地理解和应用GORM库。
摘要由CSDN通过智能技术生成

初始化

gorm.Open返回的是连接池

如下方法可以做连接池配置:

db.DB().SetMaxIdleConns(10)

db.DB().SetMaxOpenConns(100)

argsStr :="root:123456@tcp(10.58.17.238:3306)/wz?charset=utf8&parseTime=True&loc=Local"

db, err := gorm.Open("mysql", argsStr)

if err != nil {

log.Println("mysql数据库连接失败:", err)

}

表结构操作

//列名是字段名的蛇形小写

//字段`ID`为默认主键

//使用tag`primary_key`用来设置主键: AnimalId int64 `gorm:"primary_key"` // 设置AnimalId为主键

db.Debug().AutoMigrate(&mydb.People{})//自动迁移 更新表结构,只会添加缺少的字段,不会删除/更改当前数据

db.CheckTables(gormDb)//创建数据表

gormDb.Debug().HasTable(&mydb.People{})//判断数据表是否存在

gormDb.DropTable(&mydb.People{}, "products").Error//删除数据表,不存在提示报错

gormDb.DropTableIfExists(&mydb.People{}, "products").Error删除数据表,不存在不报错

gormDb.Model(&mydb.People{}).ModifyColumn("xxx", "text")// 修改模型`User`的xxx 列的数据类型为`text`

gormDb.Model(&mydb.People{}).DropColumn("xxx")// 删除模型`User`的xxx列

gormDb.Model(&mydb.People{}).AddIndex("xxx", "name", "age")// 为`name`, `age`列添加索引`xxx`

gormDb.Model(&mydb.People{}).AddUniqueIndex("xxx", "name", "age")// 为多列添加唯一索引

gormDb.Model(&mydb.People{}).RemoveIndex("xxx")// 删除索引

gormDb.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响

新增

db.Set("gorm:insert_option", "ON CONFLICT").Create(&product)

删除

db.Unscoped().Delete(&p)//使用Unscoped永久删除记录

修改

//1 更新全部字段:Save将包括执行更新SQL时的所有字段,即使它没有更改

var p People

db.First(&p)

p.Name = "jinzhu 2"

p.Age = "100"

db.Save(&p)

//2 只更新 更改的字段,可以使用Update, Updates

var p People

db.Debug().First(&p)

db.Debug().Model(&p).Update("name", "hello")

//对于结构体的更新 Updates 如果该字段的值时该类型的空值,则该字段不会被更新

db.Debug().Model(&p).Updates(People{Name: "hello", Age: ""})

//select时选择更新的字段,如果选择的字段为空值那么就不会更新该字段,都为空值则不执行该语句

//Omit是选择不更新的字段

db.Debug().Model(&p).Select("age").Updates(People{Name: "hello", Age: ""})

查询

// 使用主键获取记录

db.First(&user, 10)

SELECT * FROM users WHERE id = 10;

var ps []People

db.Debug().Where("name <> ?", "jinzhu").Find(&ps)//找出name不是jinzhu的数据

//SELECT * FROM `peoples` WHERE `peoples`.`deleted_at` IS NULL AND ((name <> 'jinzhu'))

db.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)

db.Where("name LIKE ?", "%jin%").Find(&users)

db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)

db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)

db.Where(&People{Name: "jinzhu", Age: "20"}).Find(&ps)

db.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&ps)

db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&ps)

SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';

//当使用struct查询时,GORM将只查询那些具有值的字段

db.Select("name, age").Find(&ps)// SELECT name, age FROM users;

db.Select([]string{"name", "age"}).Find(&ps)// SELECT name, age FROM users;

//虽然查询和count再一句话中,但是执行了两个sql语句,所以建议分两次查询

var num int

db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&ps).Count(&num)

// SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)

// SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)

//将结果扫描到另一个结构中。

var result Result

db.Table("users").Select("name, age").Where("name = ?", 3).Scan(&result)

其他

//Scan只能接收切片和结构体

rows:=db.Debug().Exec("show tables;").Scan(&r1)//scan should be slice or struct

db.Debug().Raw("show tables;").Scan(&r2)//scan should be slice or struct

//Exec只用于数据表的查询

//Raw用于执行数据库命令

row2:=db.Debug().Raw("show tables;").Row()

row2.Scan(&r2)

rows2,_:=db.Debug().Raw("show tables;").Rows()

defer rows2.Close()

for rows2.Next(){

rows2.Scan(&r2)

fmt.Println("r2:",r2)

}

作者: qq_43638113

链接: https://blog.csdn.net/qq_43638113/article/details/83865148

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

到此这篇关于“Go语言操作mysql的第三方包 gorm”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!

相关文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值