上一节, 我们链接了数据库, 并获取到了链接实例 `*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返回定义类型)