GORM实践记录 | 青训营

54 阅读3分钟

GORM实践记录 | 青训营

作者:LoHhhha 时间:2023.8.17

前言

本文是自己在使用GORM过程中的一些细节,分享给大家以加深自己的印象!

实践过程

建立数据库

create database test;
use test;

创建gorm模型

这里将gorm.Model作为一个成员变量,可以免去字段 IDCreatedAtUpdatedAtDeletedAt的声明。

type User struct {
    gorm.Model
    Name     string
    Password string
}

使go程序连接到数据库

// "username:password@tcp(127.0.0.1:3306)/databasename?parseTime=True"
dsn := "root:xxxxxx@tcp(127.0.0.1:3306)/test?parseTime=True"
_, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    fmt.Println(err)
    return
}

初始化表

使用得到的db变量调用其AutoMigrate方法可自动新建一张与上文建立的gorm配套模型一致的表。

err := db.AutoMigrate(&User{})
if err != nil {
    fmt.Println(err)
    return
}

执行完此代码后,查看使用show tablse;语句查看数据库test含有的表,结果如下:

+----------------+
| Tables_in_test |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

使用desc users;查看users对应的结构,结果如下:

+------------+-----------------+------+-----+---------+----------------+
| Field      | Type            | Null | Key | Default | Extra          |
+------------+-----------------+------+-----+---------+----------------+
| id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| created_at | datetime(3)     | YES  |     | NULL    |                |
| updated_at | datetime(3)     | YES  |     | NULL    |                |
| deleted_at | datetime(3)     | YES  | MUL | NULL    |                |
| name       | longtext        | YES  |     | NULL    |                |
| password   | longtext        | YES  |     | NULL    |                |
+------------+-----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

我们可以发现,我们在定义User的时候需要以大写首字母的驼峰形式书写,而创建的时候自动将模型名的复数及各属性对应的下划线写法作为表名及字段名。

我们也可以使用同时生成多个表,管理多个表。

使用

插入一个元素

user := User{Name: "lohhhha", Password: "123456"}
result := db.Create(&user)
if result.Error != nil {
    fmt.Println(result.Error)
    return
}

在我们传入user对象的时候我们就指定了插入的表,所以我们并没有显式地写出我们插入的是哪一个表,这将自动推测出。

查询元素

  • .First().Take().Last().Find().Rows()是最终操作,将会结合前方给出的条件进行筛选返回。
  • 条件选择有.Where().Not().Or()等。
  • 其他功能性函数还有.Select().Order().Limit()等。

若我们想筛选名字按字典序最小的用户,我们可以这样写:

var user User
db.Order("name").First(&user)
if db.Error != nil {
    fmt.Println(db.Error)
    return
}
fmt.Println(user)

其运行结果为:

{{1 2023-08-16 12:20:58.165 +0000 UTC 2023-08-16 12:20:58.165 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false}} lohhhha 123456}

更新元素

  • .Save()

    在我们查询到一个元素后,我们可以对返回的对象进行修改,最后通过db.save(&)来完成更新。

    也可以直接新建一个对象再通过调用db.save(&),当对象的ID不给出时译为插入,当给出时译为更新。

  • .Update()

    通过给定的条件及.Update()给出的参数完成更新。

    例如将namelohhhhaUser对象对应的表中的元素的password改为111111可以这样写:

    db.Model(&User{}).Where("name=?","lohhhha").Update("password","111111")
    

    注意:此操作将修改所有满足要求的元素。

删除元素

使用.Delete(&)完成对满足条件的元素进行删除,注意会对所有满足条件的元素删除。

比如我们想将namelohhhhaUser对象对应的表中的元素删除,我们可以这样写:

db.Where("name","lohhhha").Delete(&User{})

注意:gorm默认删除是软删除,其只会更新deleted_at字段,并不会真正将元素删除。