用Gorm连接数据库,再创建一个表 | 青训营

2023年 8月 13日 68.5k 0

环境搭建命令

引入gorm 和 mysql-driver

首先需要导入依赖,我使用的是gorm2,所以没有jinzhu做开头
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

连接数据库

    //连接mysql数据库的核心代码
    dsn := "root:root123456@tcp(192.168.157.129:3306)/tiktok?&parseTime=True"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

其中:
root 为mysql用户名
root123456 为mysql密码
192.168.157.129 为我安装mysql服务的Linux虚拟机的ip地址,当然也可以修改为localhost或其他ip地址
3306没什么好说的,mysql的默认端口

创建对应表中数据的结构体


// User 用户实体类
// 唯一联合索引 Username -> Password
type User struct {
    Username        string `gorm:"size:32;uniqueIndex:idx_username_password"`
    Password        string `gorm:"size:32;uniqueIndex:idx_username_password"`
    Avatar          string `gorm:"size:255"`
    BackgroundImage string `gorm:"size:255"`
    Signature       string `gorm:"size:200"`
    gorm.Model
}

其中Username,Password等字段需要遵循gorm的规则大写首字母,gorm默认字段名的蛇形命名即表中的列名,如BackgroundImage对应了表中的background_image。gorm默认表名对应结构体名的蛇形复数对于User结构体即为users。
如果不喜欢这样的对应关系,您也可以通过gorm文档中提供的方式进行修改(表名和字段名的约束和修改可以参照官方文档-约束),此处我使用gorm的迁移技术建表,故不作修改。

这里我再结构体的每个字段后面都添加了gorm所提供的标签,这是实现gorm AutoMigrate建表的重要手段。gorm标签的格式为\

`gorm:"内容"`

以上方User用户实体类,Username字段为例,右侧的标签所展示的那样,当我们需要使用多个标签时,可以使用分号进行分割。其中size:32表示列中存储的数据长度为32,对应的就是mysql数据库中的varchar(32),主要用于字符串类型。uniqueIndex:idx_username_password表示给Username字段添加唯一索引,我给Username和Password都添加了该标签,表示创建联合唯一索引idx_username_password,索引的数据依次为username,password。
索引数据的顺序会影响查询效率,那么为什么是Username,Password的顺序而不是Password,Username的顺序呢?
这是因为gorm中字段的默认优先级都为10(数字越小越优先)。当我们不指定字段的优先级时,谁最靠前,谁越优先,如果我们将Password的标签改为

`gorm:"size:32;uniqueIndex:idx_username_password;priority:1"`

索引就会变成password,username的顺序了。具体可以参考数据库索引 和 模型定义

那么gorm.Model是什么呢?下面是gorm源码中对gorm.Model的定义。ID即是数据库中的主键id,CreateTime和UpdateTime也就是创建和更新时间,DeleteAt则是用于软删除的字段。引入了gorm.Model,就可以让gorm替我们实时更新createTime和updateTime,并让gorm进行软删除操作的支持。


type Model struct {
    ID        uint `gorm:"primarykey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt DeletedAt `gorm:"index"`
}

如果您不想引入这么多字段,也可以只往结构体中加入这其中的字段,比如添加DeleteAt gorm.DeleteAt到结构体中就可以实现软删除的效果,像这样。CreateTime和UpdateTime也同样得到gorm的支持,只要加进去就可以让gorm代为管理


// User 用户实体类
// 唯一联合索引 Username -> Password
type User struct {
    Username        string `gorm:"size:32;uniqueIndex:idx_username_password"`
    Password        string `gorm:"size:32;uniqueIndex:idx_username_password"`
    Avatar          string `gorm:"size:255"`
    BackgroundImage string `gorm:"size:255"`
    Signature       string `gorm:"size:200"`
    DeleteAt        gorm.DeleteAt `gorm:"index"`
}

当我们完成工作之后,只需要进行最后一步


// InitTables 初始化数据表格
func InitTables() {

    //model是包名,User是结构体名
    err := DB.AutoMigrate(&model.User{}) //这里可以有很多个结构体
    if err != nil {
        fmt.Println("autoMigrate error !!!")
        return
    }
}

调用AutoMigrate方法,就可以在数据库中根据您所定义的结构体信息建表了。这一方法可以参考官方文档-迁移

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论