🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
上一节, 我们链接了数据库, 并获取到了链接实例 `*Connection`, 这一节, 我们配置表结构, 以便后续使用 我们可以使用struct结构体来指定表名和字段, 同时, 我们也可以string字符串来指定表名 ## 表结构struct定义 以users表为例, 定义struct ```go type Users struct { Name string `orm:"name"` Age int } func (u Users) TableName() string { return "users" } ``` 这里我们定义了一个结构体`Users` 以及对应的一个方法`TableName()` , 这里的struct解析后, 会获取到字段 `name, Age`. 不难看出, 指定了tag的字段会解析对应的`orm key` 的值, 如果没有指定tag, 则获取字段本身的值 这里的`TableName()` 则是指定表名(`users`)用的, 如果没有该方法, 则或获取struct本身的名字`Users` 用法示例: ```go var user Users var users []Users db.Table(&user).Select() // 获取一条 db.Table(&users).Limit(10).Select() // 获取10条 ``` ## string类型的表名 示例: ```go db.Table("users").First() // 获取一条 db.Table("users").Limit(10).Get() // 获取10条 ``` ## 关于struct字段类型的特殊说明 ### 一. 时间字段类型的处理 关于时间字段, 官方文档中给出了说明和解决方案, 有`string`类型和`time.Time`类型 在新版本的go中, 都默认使用了 time.Time 作为默认的类型, 我们可以采用如下的方法正确使用他 1. 在链接数据库的时候, 我们需要设置dsn的parseTime参数值为true, 则默认查询数据类型为`time.Time` ``` root:root@tcp(localhost:3306)/test?charset=utf8&parseTime=true ``` 2. 如果不设置 parseTime参数值为true, 则使用 string 类型 ### 二. 其他字段类型的处理 当我们设计表的时候, 最好设置字段为 `not null`, 比如varchar可以设置为 `default ''`来代替. 这里不仅仅是数据库优化问题, 同时, 在这里, 当一个字段的值为null时, struct会导致查询为空的情况. 如果确实已经设置为null了, 那我们就需要特别注意了, 对字段类型要做一些特殊的处理.根据官方文档给出的方案,我们可以做如下处理: 1. 使用对应类型的指针, 即 *string, *int64 等 2. 使用`database/sql`给出的类型 sql.NullString, sql.NullInt64 等 以上两种方式都可以避免查询为空的情况, 第二种用法的结果是一个struct, 返回的时候需要做一下处理, 第一种情况则可以直接返回给前端使用,根据自己的实际情况做出合理的选择即可 ## 表名选择的区别 - 是否预设struct (string类型不需要预设struct) - 解析时, 是否会用到reflect(反射) (string类型不会用到反射, struct会用到反射) - 获取结果是否是确定类型 (string表名, 返回值类型为interface, struct返回定义类型)