抖音项目 Gorm 连接 MySQL | 青训营笔记

205 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记

问题背景

我们小组选择的题目是抖音项目,毫无疑问这个项目需要用到数据库,MySQL 比较通用,而 Gorm 的开发者本尊就在字节,所以我们选择了 Gorm+MySQL 的组合

Gorm 连接 MySQL

连接数据库的第一步就是要配置好 Gorm 和 MySQL 环境。(确实没想到这是 n 个小时痛苦面具的开始),参照官方文档,写了以下代码:

dsn := DBUserPass + "@tcp(localhost:3306)/" + DBName + "?charset=utf8mb4&parseTime=True&loc=Local"
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
   fmt.Println("Database connection failed")
}
db.AutoMigrate(&Test{})
// dbMig := db.Migrator()
// _ = dbMig.CreateTable(&Test{})
test := Test{"a", 1}
if err = db.Create(test).Error; err != nil {
   fmt.Println("Table creation failed")
} else {
   fmt.Println(db.Migrator().HasTable(&Test{}))
}

其中 Test 是用来测试的一个结构体,dsn 是数据库的相关信息,其结构是 {username}:{password}@tcp({ip}:{port}){DBName}? 。按理来说,这段代码应该没有任何问题:首次执行 AutoMigrate 应当创建一个名为 tests 的表,如果失败的话用注释的两行代码应当也能实现,然后向其中插入一条数据,最后告诉我们这个表已经创建成功了。然而运行时,非但没有在控制台打出任何信息,而且还报了以下错:

image.png

查看 MySQL 的表格,显示什么都没有

image.png

尝试了很多代码,更新、重装、删库跑路 MySQL 好几次都没有解决。直到我盯着那张报错的图仔细研究,才发现:紫色的应该是 MySQL 的报错信息,而下方那一行应当是 Gorm 生成的 MySQL 代码(本人没有 SQL 基础,所以对这方面并不敏感)

我的 Test 结构体中含有两个变量,一个 string 和一个 int。仔细一看,生成的这条语句,括号里好像少了点什么,正常来讲应该是这样才对

CREATE TABLE `tests` (name VARCHAR(200), id int);

于是尝试将上方初始化数据库的代码db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})改为:

db, err = gorm.Open(mysql.New(mysql.Config{
   DSN:               dsn,
   DefaultStringSize: 128,
}), &gorm.Config{})

以此指定 string 类型的长度,然而程序还是报出了同样的错误。看来问题的根本在于出于某种原因,Gorm 并没有识别到结构体内部的变量,因此生成了一条没有 column 的创建表语句,导致 MySQL 报错,而解决方法简单地不能再简单,那就是结构体内部变量命名必须是:

大驼峰