Go實戰(zhàn)項目【四】數(shù)據(jù)庫與構建用戶模塊

這章開始,我們將會接觸到數(shù)據(jù)庫的相關內(nèi)容,使用了gorm這個庫,gorm中文文檔這里查看中文文檔。

進行之前,要保證電腦安裝了mysql,可以看我這篇文章安裝mysql,安裝完成后,要創(chuàng)建數(shù)據(jù)庫和配置文件當中的保持一致,比如app.ini中配置的數(shù)據(jù)庫名稱為api。

使用gorm依賴

終端執(zhí)行下載gorm

go get -u github.com/jinzhu/gorm

創(chuàng)建models/models.go文件,在這個文件中創(chuàng)建初始化方法
models/models.go

package models

import (
    "api/pkg/logging"
    "api/pkg/setting"
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

var db *gorm.DB     //數(shù)據(jù)庫實例,定義為了全局變量

func SetUp() {
    var (
        err error
        databaseType = setting.DatabaseSetting.Type     //數(shù)據(jù)庫類型
        user = setting.DatabaseSetting.User     //數(shù)據(jù)庫的用戶
        pass = setting.DatabaseSetting.Password //數(shù)據(jù)庫的密碼
        host = setting.DatabaseSetting.Host     //數(shù)據(jù)庫地址
        name = setting.DatabaseSetting.Name     //數(shù)據(jù)庫名稱
    )

    //使用gorm鏈接數(shù)據(jù)庫
    db , err = gorm.Open(databaseType,fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True",user,pass,host,name))
    if err != nil {
        logging.Fatal("數(shù)據(jù)庫鏈接失敗",err)    //數(shù)據(jù)庫鏈接失敗是致命的錯誤,鏈接失敗后可以關閉程序了,所以使用logging.Fatal方法
    }

    //設置表名稱的前綴
    gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
        return setting.DatabaseSetting.TablePrefix + defaultTableName
    }

    db.SingularTable(true)  //設置禁用表名的復數(shù)形式
    db.LogMode(true)              //打印日志,本地調(diào)試的時候可以打開看執(zhí)行的sql語句

    db.DB().SetMaxIdleConns(10)     //設置空閑時的最大連接數(shù)
    db.DB().SetMaxOpenConns(100)        //設置數(shù)據(jù)庫的最大打開連接數(shù)
}

注意一點,在使用gorm操作mysql數(shù)據(jù)庫的時候,不要漏掉import _ "github.com/jinzhu/gorm/dialects/mysql",否則運行的時候會報錯

main.go文件中初始化

...
    setting.SetUp() //初始化配置文件
    logging.SetUp()     //設置日志文件
    models.SetUp()      //設置數(shù)據(jù)庫
...

可以在終端執(zhí)行go run main.go,查看下是否鏈接mysql成功。

用戶數(shù)據(jù)庫模型

項目把用戶的登錄和注冊做成了一個接口,整個流程如下:


登錄注冊流程圖

根據(jù)上述流程,設計一個簡單的user表。如下

用戶表

字段名 類型 描述 備注
id int 自增長 ID 主鍵
create_at date 創(chuàng)建時間 gorm自帶
update_at date 更新時間 gorm自帶
deleted_at date 刪除時間 gorm自帶
mobile char(11) 手機號 手機號,因為是固定的11位格式,使用char格式,加索引,唯一且不為nil

id,create_at,update_at,deleted_at使用的是gorm.model結構體自動創(chuàng)建的。以后不會在文章中說明這4個字段,但我們要知道。

先簡單的創(chuàng)建了一個mobile供我們使用,后續(xù)會添加例如name...字段,使用gorm的自動維護。

models/user.go文件中創(chuàng)建用戶模型

package models

import "github.com/jinzhu/gorm"

type User struct {
    gorm.Model  //會自動添加id,created_at,updated_at,deleted_at四個字段,可以進入看下類型
    Mobile        string         `gorm:"type:char(11);index;unique;not null;" json:"mobile,omitempty"` //手機號,加索引,唯一,不為空
}

這樣的話,就定義了一個簡單的user模型。然后就交給gorm,讓它來根據(jù)模型創(chuàng)建數(shù)據(jù)表。
models/models.go

...
db.LogMode(true)        //打印日志,本地調(diào)試的時候可以打開看執(zhí)行的sql語句
db.AutoMigrate(&User{}) //自動檢查 Tag 結構是否變化,變化則進行遷移,需要的參數(shù)為數(shù)據(jù)庫模型結構體
...

使用AutoMigrate方法,可以自動維護,只要把定義好的結構體傳入即可。然后重新執(zhí)行go run main.go

user表

可以看到成功的創(chuàng)建了用戶表。

后期需要在user表中添加新的字段,比如name,age等,就可以直接在結構體中添加,重新run一下,gorm就會自動幫我們維護數(shù)據(jù)表了。

根據(jù)項目的需求,整理了一下user表所需要的字段:

用戶表

字段名 類型 描述 備注
id int 自增長 ID 主鍵
mobile char(11) 手機號 手機號,因為是固定的11位格式,使用char格式,加索引,唯一且不為nil
name varchar(12) 昵稱 唯一
desc varchar(100) 個人簡介 簡介
sex tinyint(1) 性別 性別,1=man,2=woman,使用tinyint格式,默認為0未知
age int 年齡 用戶年齡,存儲的是時間戳,注意要用int64,因為flutter只有13位的時間戳
avator varchar(255) 頭像 頭像
follow_num int 關注數(shù) 用戶關注他人的數(shù)量
fans_num int 粉絲數(shù) 用戶的粉絲數(shù)
state tinyint(1) 狀態(tài) 用戶狀態(tài),比如=1賬號凍結,=2不允許聊天之類的,默認=0
weixin_openid varchar 微信授權用戶唯一標示 唯一
weixin_unionid varchar 微信授權用戶唯一標示 唯一
qq_openid varchar QQ授權用戶唯一標示 唯一

那么結構體User的格式如下:

package models

import (
    "database/sql"
    "github.com/jinzhu/gorm"
)

type User struct {
    gorm.Model                                                                                         //會自動添加id,created_at,updated_at,deleted_at四個字段,可以進入看下類型
    Mobile        string         `gorm:"type:char(11);index;unique;not null;" json:"mobile,omitempty"` //手機號,加索引,唯一,不為空
    Name          string         `gorm:"type:varchar(12);"`                                            //用戶昵稱,3-12個字符
    Desc          string         `gorm:"type:varchar(100);"`
    Sex           int            `gorm:"type:tinyint(1);default:0;"`
    Age           string         `gorm:"type:char(13);"` //用戶年齡,存儲的是時間戳字符串
    Avatar        string         `gorm:"type:varchar(255);"`
    FollowNum     int            `gorm:"default:0;"`
    FansNum       int            `gorm:"default:0;"`
    State         int            `gorm:"type:tinyint(1);default:0;" json:"-"` //用戶狀態(tài),比如=1賬號凍結,=2不允許聊天之類的,默認=0,為json時不返回
    WeixinOpenid  sql.NullString `gorm:"unique;index;" json:"-"`              //微信openeid,唯一,加索引,json不返回,注意類型使用sql.NullString。因為設置了唯一,而string默認為"",所以會有沖突,一下同理
    WeixinUnionid sql.NullString `gorm:"unique;" json:"-"`                    //微信unionid,唯一,json不返回
    QqOpenid      sql.NullString `gorm:"unique;index;" json:"-"`              //QQopenid,唯一,加索引,json不返回
}

可以對應上面的表格,看下gorm是如何定義的。
注釋中也有詳細的解釋,注意看下,比如為什么用sql.NullString類型。

最后重新執(zhí)行run命令


image.png

點關注,不迷路

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容