前言
本篇文章用于新手学习Go语言的Gorm框架,用于快速增删改查。
gorm入门
本篇文章使用的gorm链接的数据库均为mysql
gorm链接mysql方式
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
这个是官网的链接数据库方式。
这里需要注意导入的包,因为gorm有着重写的mysql自定义驱动,所以需要导入他们官网上的包。
"gorm.io/driver/mysql"
"gorm.io/gorm"
同时返回的db结构,也可以设置并发和最大连接池。
SQL, err := gorm.Open(mysql.Open(sqlInit), &gorm.Config{})
sql, err := SQL.DB()
// 设置最大连接数 默认为0 也就是没有限制
sql.SetMaxOpenConns(0)
// 设置最大空闲连接 每次执行完语句都将连接放入连接池,默认为2
sql.SetConnMaxIdleTime(100)
设置好之后就可以正常使用gorm进行数据库操作了。
进行结构体绑定
type Register struct {
User string `json:"User,omitempty"`
UserName string `json:"UserName,omitempty" gorm:"column:username"`
UID string `json:"UID,omitempty" gorm:"column:uid"`
Password string `json:"Password,omitempty" `
Auto string `json:"Auto,omitempty"`
Times int64 `json:"Times"`
}
用这个举列子。
倘若使用这个结构体,我们可以发现column值得是绑定数据库的字段,因为部分结构体的参数会有大小写,倘若链接绑定不到相应 的结构体,就可以用这种方式。
结构体选择数据表或gorm直接选中数据表
当你使用这个字段时,gorm会自动绑定数据表,会自动加上s,比如Register这个结构体,会变成Registers数据表。
当我们不想使用s作为后缀,有着两种方式。
第一种
config.MysqlURL.Table("user_account").Where("user=?", r.User).First(&R)
使用Table用于绑定一个数据表。
第二种
使用反射将mysql数据表去掉s,gorm官网有介绍。
使用gorm进行增加记录,删除记录,更改记录,查询记录
增加记录
// 自己的列子
if err := config.MysqlURL.Table("user_account").Create(&r).Error; err != nil {
// 官网的代码
db.Select("Name", "Age", "CreatedAt").Create(&user)
从这里可以看出Create时用于创建记录的命令,其中的r指的是绑定的数据库模型结构体。
报错信息Gorm:Panic info is: runtime error: invalid memory address or nil pointer dereference
解决方法:必须要使用&,否则会报错。
查询记录
config.MysqlURL.Table("user_account").Where("user=?", r.User).First(&R)
这里看出Where就是用于查询需要的条件的,这个的语句时查询与数据库的user是否有相同的记录值。
删除记录
// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;
// 带额外条件的删除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";
Delete很容易看出来是删除字段的功能。
这里的Where看上面的查询功能。
更改记录
// 条件更新
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
有了上面的基础,很容易看懂这个。
这个的关键语句就是update,这个语句功能是更新name字段的where选定记录的值改为hello。
gorm开发分页器
func (t *Task) ReadTask(i, m int64) ([]taskrun, int64) {
var r []taskrun
if m-i >= 25 {
return r, 0
}
result := orm.Where("user=?", t.Session.goadminUser.Username).Find(&r)
orm.Where("user=?", t.Session.goadminUser.Username).Scopes(Paginate(i, m)).Find(&r)
// in := result.RowsAffected / (m - i)
// if result.RowsAffected%(m-i) != 0 {
// in++
// }
// orm.Where("user=?", user).Limit(i).Offset(m).Find(&u)
logrus.Info("计算的分页总数结果:", result.RowsAffected)
logrus.Info(r)
return r, result.RowsAffected
}
其中i是起始地址,m是最大地址。