连接数据库
import "github.com/jinzhu/gorm"func initdb() {
// 第一个参数:数据库类型(mysql,postgres)
// 第二个参数:数据库连接,用户名:密码@protocal(ip:port)
conn := "root:root@tcp(192.168.1.12:3306)?charset=Utf8&parseTime=true&loc=Local"
db,err := gorm.Open("mysql", conn)
defer db.Close()
//SetMaxOpenConns用于设置最大打开的连接数
//SetMaxIdleConns用于设置闲置的连接数
db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)}
定义模型
type User struct{
Namestring`gorm:"column:name"`
Ageint`gorm:"default:18"`
Hobby[]string `gorm:"column:interests"`
}
//注意最后hobby在数据库里的column是interestsfunc (User) TableName() string {
return "users"
}
插入数据(传入的是地址)
user := User{
Name : "amber",
Age:23,
Hobby : nil,
}
err := db.Create(&user).Error
注意:这里如果要创建多个,必须每次重新初始化user对象
更新数据 第一种方式:根据筛选条件更新某几项参数
name := "necy"
age := 25
err := db.Model(&User).Where("name = ?", name).Update("age", age).Error
第二种方式:不管有没有更新项直接update
user := User{
Name : "amber",
Age:23,
Hobby : nil,
}
// &user 传入的具体参数,如果里面包含主键,便只更新匹配主键的对象
err := db.Update(&user).Error
// &user{}更新所有user对象
err := db.Update(&user{}).Error
删除数据
user := User{}
err := db.Where("name = ?", name).Delete(&user).Error
查询单个数据
user := User{}
err := db.Where("name = ?", name).First(&user) //查询一个
查询多个数据
user := []User{}
err := db.Where("name = ?", name).Find(&user) //只能用长度判断数据是否存在
查询个数
var count int
err := db.Where("name = ?", name).Find(&user).Count(&count)
err := db.Table("users").Where("name = ?", name).Count(&count)
开启debug模式:
err := db.DEBUG().Where("name = ?", name).Find(&user).Count(&count)
【goland连接数据库】注意:如果查询plunk这种非整条数据返回,log里显示 0rows return
获取年龄最大值
func getMaxAge() {
max := 0
name = "amber"
rows, err := db.Table("users").Select(" MAX(age) AS max ").Where(" name = ? ", name ).Rows()
if err != nil {
common.Log.Error("查询最大值年龄报错 %v", err)
}
if rows.Next() {
err := rows.Scan(&max)
if err != nil {
common.Log.Error("报错 %v", err)
}
}
defer rows.Close()
}
获取成绩最高且年龄大于20的同学名字
// 初始化name要带引用
name := &[]string{}err := db.DB.Debug().Table("users").Where("age>= ? AND score= (select max(score) from users)", 20).Pluck("name", name).Error
if err != nil {
fmt.Println(name)
}
查询大于指定ip的数据
select ip from devices where INET_ATON(ip) >= '192.168.1.0'db.Where("INET_ATON(ip) >= INET_ATON(?)", "192.168.1.0")
更新指定范围内数据
var uuids []string
DB.Model(&User{}).Where("uuid IN (?)", uuids).UpdateColumn("age", 18).Error
获取指定偏移量数据
// 每次取出指定数量数据,偏移量和指定数量要一致
var limit int
var offset int
DB.Debug().Limit(limit).Offset(offset).Find(&User{}).Error
推荐阅读
- 数据库|SQL行转列方式优化查询性能实践
- mysql|一文深入理解mysql
- 达梦数据库|DM8表空间备份恢复
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- 谈灾难恢复指标(RTO与RPO是什么鬼())
- RPO与RTO
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...