前言:我为hade增加了model自动生成api的功能,这篇记录下我完成这个功能过程中是如何使用GPT来做协助的。
hade的v1.0.6版本发布,增加根据model自动生成api的功能
之前给hade增加过一个model gen的功能,就是配置好数据库的配置文件,自动生成数据表的gorm的模型文件。但是其实还可以更近一步,我可以生成model模型文件,那么我肯定就能生成这个model对应的api,当然前提是这个api是“按照某种规范”的。
所以hade的v1.0.6就迭代了下这个功能。官方文档更新如下:http://hade.funaio.cn/guide/model.html
在./hade model下增加了两个命令,形成3个命令
./hade model api 通过数据表自动生成api代码
./hade model gen 通过数据表自动生成model代码
./hade model test 测试某个数据库是否可以连接
最复杂的就是./hade model api的命令,这里记录下开发这个命令的心路历程。
功能分析
要输入一个表名字,输出这个表的api等,首先我要获取这个表的所有字段和类型。
问题1:怎么获取一个表的所有字段
那么怎么获取一个表的所有字段和类型呢?我也先询问了下ChatGPT:
我们可以用gorm来获取一个表的所有字段到一个map[string]string 中。
具体使用的是这个sql语句:SHOW COLUMNS FROM student
可以使用GORM的Raw
方法和Scan
方法将SHOW COLUMNS FROM
语句查询到的结果解析为一个map类型。具体的代码如下:
goCopy code
// 定义一个用于存储字段名和字段类型的结构体
type Column struct {
Field string `gorm:"column:Field"`
Type string `gorm:"column:Type"`
}
// 定义一个map类型,用于存储字段名和字段类型
columns := make(map[string]string)
// 执行原始的SQL语句
rows, err := db.Raw("SHOW COLUMNS FROM student").Rows()
if err != nil {
// 处理错误
}
// 逐行解析查询结果
for rows.Next() {
var column Column
if err := db.ScanRows(rows, &column); err != nil {
// 处理错误
}
columns[column.Field] = column.Type
}
// 输出结果
fmt.Println(columns)
上述代码中,首先定义了一个结构体Column
,用于存储每个字段的名称和类型。接着定义了一个map[string]string
类型的变量columns
,用于存储所有字段的名称和类型。
然后,使用Raw
方法执行原始的SQL语句SHOW COLUMNS FROM student
,并通过Rows
方法获取查询结果的行数据。对于每一行数据,使用ScanRows
方法将其解析为一个Column
结构体,再将结构体中的Field
字段作为columns
的键,Type
字段作为columns
的值,存储到columns
变量中。
最后,输出columns
变量的内容,即可得到包含所有字段名称和类型的map。注意,在使用完查询结果之后,需要及时关闭rows,避免资源泄露。可以在循环结束后通过调用rows.Close()
来关闭rows。
上述代码中的columns
是一个map[string]string
类型的变量,用于存储所有字段的名称和类型。它的输出结果类似于下面这个样子:
goCopy code
map[id:uint name:string age:uint class_id:uint]
输出结果中,map
表示这是一个map类型的变量,而id
、name
、age
和class_id
则是这个map中的键,它们的值分别是uint
和string
类型,表示对应字段的数据类型。注意,输出结果中各个键值对的顺序可能会因为内部实现原因而不同。
====
尝试了一下确实可行,但是在hade中,一切皆接口,于是我修改了一下之前的orm的接口协议。
type TableColumn struct {
Field string `gorm:"column:Field"`
Type string