前言

本篇文章用于新手学习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是最大地址。


最后修改:2022 年 04 月 26 日
如果觉得我的文章对你有用,请随意赞赏