您的位置:首页 > 编程语言 > Go语言

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

2018-11-08 17:43 351 查看

初始化

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)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: