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

初始化

 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)
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值