上一節, 我們鏈接了數據庫, 并獲取到了鏈接實例 `*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返回定義類型)