中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

問答論壇網(wǎng)站建設(shè)網(wǎng)站怎么制作教程

問答論壇網(wǎng)站建設(shè),網(wǎng)站怎么制作教程,手機(jī)設(shè)計培訓(xùn)網(wǎng)站建設(shè),吳中區(qū)網(wǎng)站設(shè)計公司目錄文件結(jié)構(gòu)數(shù)據(jù)庫準(zhǔn)備配置文件處理config.godb_list.gogorm_mysql.gosystem.go初始化數(shù)據(jù)庫gorm.gogorm_mysql.go開始初始化測試數(shù)據(jù)庫定義實(shí)體類 Userserviceapi開始測試!文件結(jié)構(gòu) 本文章將使用到上一節(jié)創(chuàng)建的 CommonService 接口,用于測試連接數(shù)據(jù)庫…

目錄

      • 文件結(jié)構(gòu)
      • 數(shù)據(jù)庫準(zhǔn)備
      • 配置文件處理
        • config.go
        • db_list.go
        • gorm_mysql.go
        • system.go
      • 初始化數(shù)據(jù)庫
        • gorm.go
        • gorm_mysql.go
        • 開始初始化
      • 測試數(shù)據(jù)庫
        • 定義實(shí)體類 User
        • service
        • api
        • 開始測試!

文件結(jié)構(gòu)

本文章將使用到上一節(jié)創(chuàng)建的 CommonService 接口,用于測試連接數(shù)據(jù)庫狀況,當(dāng)然您也可以自制簡單接口作為測試,不會影響整體工作流程!

下方樹狀圖為最終項目結(jié)構(gòu)

文件夾 api 與 service 助力數(shù)據(jù)庫查詢請求

initialize/gorm.go 初始化 GORM
initialize/gorm_mysql.go 執(zhí)行 MySQL 數(shù)據(jù)庫對應(yīng)的初始化過程

user.go 一個實(shí)體類

│  config.yaml
│  go.mod
│  go.sum
│  main.go
│
├─api
│  │  enter.go
│  │
│  ├─example
│  └─system
│          api_common.go
│          enter.go
│
├─config
│      config.go
│      db_list.go
│      gorm_mysql.go
│      jwt.go
│      local.go
│      system.go
│
├─core
│      constant.go
│      server.go
│      viper.go
│
├─global
│      global.go
│
├─initialize
│  │  gorm.go
│  │  gorm_mysql.go
│  │  router.go
│  │
│  └─internal
│          gorm.go
│
├─model
│      user.go
│
├─router
│  │  enter.go
│  │
│  ├─example
│  └─system
│          enter.go
│          sys_common.go
│
└─service

之后回到項目根目錄,打開命令行,輸入指令安裝 MySQL 驅(qū)動:
go get -u gorm.io/driver/mysql


數(shù)據(jù)庫準(zhǔn)備

這是我本地使用的數(shù)據(jù)庫參數(shù):
username:root
password:123456
dbname:golang

這是數(shù)據(jù)庫“golang”中的數(shù)據(jù)表 user 的數(shù)據(jù),注意到有四個屬性

在這里插入圖片描述


來到 go 項目中,根據(jù)上述參數(shù),打開 config.yaml,添加 mysql 配置
(這里為了便于大家操作,省去了源碼中的注冊 zap 的部分)

同時添加 system 對象,內(nèi)含一個 db-type 屬性,用來定義我們希望后端鏈接的數(shù)據(jù)庫類型

system:db-type: "mysql"mysql:path: "localhost"port: "3306"config: ""db-name: "golang"username: "root"password: "123456"max-idle-conns: 10max-open-conns: 100

配置文件處理

由于我們?yōu)?config.yaml 添加了新的配置項,所以需要按照我們之前文章所屬,為其配置指定的結(jié)構(gòu)!


config.go

打開(如果你跟隨上上節(jié)文章)或者新建文件 config/config.go

在主 config 入口添加 mysql 屬性

type Server struct {...Mysql Mysql `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
}

db_list.go

新建文件 config/db_list.go

由于我們有可能需要支持多種類型的數(shù)據(jù)庫(比如 PostgreSQL),所以最佳解決辦法就是創(chuàng)建一個通用的數(shù)據(jù)庫參數(shù)結(jié)構(gòu)體

DSNProvider 接口用來給 GORM 提供 DSN

type DSNProvider interface {Dsn() string
}type GeneralDB struct {Path         string `mapstructure:"path" json:"path" yaml:"path"`                               // 服務(wù)器地址:端口Port         string `mapstructure:"port" json:"port" yaml:"port"`                               //:端口Config       string `mapstructure:"config" json:"config" yaml:"config"`                         // 高級配置Dbname       string `mapstructure:"db-name" json:"db-name" yaml:"db-name"`                      // 數(shù)據(jù)庫名Username     string `mapstructure:"username" json:"username" yaml:"username"`                   // 數(shù)據(jù)庫用戶名Password     string `mapstructure:"password" json:"password" yaml:"password"`                   // 數(shù)據(jù)庫密碼Prefix       string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`                         //全局表前綴,單獨(dú)定義TableName則不生效Singular     bool   `mapstructure:"singular" json:"singular" yaml:"singular"`                   //是否開啟全局禁用復(fù)數(shù),true表示開啟Engine       string `mapstructure:"engine" json:"engine" yaml:"engine" default:"InnoDB"`        //數(shù)據(jù)庫引擎,默認(rèn)InnoDBMaxIdleConns int    `mapstructure:"max-idle-conns" json:"max-idle-conns" yaml:"max-idle-conns"` // 空閑中的最大連接數(shù)MaxOpenConns int    `mapstructure:"max-open-conns" json:"max-open-conns" yaml:"max-open-conns"` // 打開到數(shù)據(jù)庫的最大連接數(shù)
}

gorm_mysql.go

新建文件 gorm_mysql.go

在這里定義 mysql 結(jié)構(gòu)體,直接使用通用數(shù)據(jù)庫參數(shù)結(jié)構(gòu)體 GeneralDB 即可

然后于此實(shí)現(xiàn)接口 DSNProvider ,構(gòu)造 DSN

type Mysql struct {GeneralDB `yaml:",inline" mapstructure:",squash"`
}func (m *Mysql) Dsn() string {return m.Username + ":" + m.Password + "@tcp(" + m.Path + ":" + m.Port + ")/" + m.Dbname + "?" + m.Config
}

system.go

打開文件 config/system.go

老樣子,為 db_type 配置對應(yīng)結(jié)構(gòu)體內(nèi)容

type System struct {DbType string `mapstructure:"db-type" json:"db-type" yaml:"db-type"`
}

初始化數(shù)據(jù)庫

gorm.go

新建文件 initialize/gorm.go

此處的邏輯很簡單,即通過全局變量獲取 db_type 屬性,得知開發(fā)者想要用那種數(shù)據(jù)庫;
由于我們只會用到 MySQL,故這里的判斷就都啟動 mysql 了

GormMysql 目前處于飄紅狀態(tài),因?yàn)檫€沒有定義,下面我們將為其定義初始化 MySQL 的方法

import ("ginlogin/global""gorm.io/gorm"
)func Gorm() *gorm.DB {switch global.G_CONFIG.System.DbType {case "mysql":return GormMysql()default:return GormMysql()}
}

gorm_mysql.go

新建文件 initialize/gorm_mysql.go

具體通過 GORM 鏈接 mysql 的過程相信大家也很熟悉,這里就不多費(fèi)口舌了,直接看注釋吧!

import ("fmt""ginlogin/global""gorm.io/driver/mysql""gorm.io/gorm"
)// 初始化mysql方法,返回一個gorm.DB引用
func GormMysql() *gorm.DB {// 第一步// 全局變量獲取config中定義的mysql參數(shù)// 判斷如果不急于數(shù)據(jù)庫名,直接返回nil表示初始化數(shù)據(jù)庫失敗info := global.G_CONFIG.Mysqlif info.Dbname == "" {return nil}// 第二步// 構(gòu)造mysqlConfigmysqlConfig := mysql.Config{DSN:                       info.Dsn(),DefaultStringSize:         191,SkipInitializeWithVersion: false,}// 第三步// gorm.Open連接到數(shù)據(jù)庫,并處理錯誤if db, err := gorm.Open(mysql.New(mysqlConfig)); err != nil {fmt.Println("完蛋,連接不上數(shù)據(jù)庫!!!")return nil} else {// 如果成功鏈接,設(shè)置好連接池啥的,就可以返回db了db.InstanceSet("gorm:table_options", "ENGINE="+info.Engine)sqlDB, _ := db.DB()sqlDB.SetMaxIdleConns(info.MaxIdleConns)sqlDB.SetMaxOpenConns(info.MaxOpenConns)return db}
}

開始初始化

哎?這還沒完,你還要調(diào)用初始化方法!

打開 main.go,添加如下代碼,調(diào)用 GORM 初始化方法

func main() {// 初始化數(shù)據(jù)庫DBglobal.G_DB = initialize.Gorm()...
}

此處關(guān)于整合 mysql 的部分已經(jīng)完結(jié)了,下面將是測試數(shù)據(jù)庫的內(nèi)容,您可以直接略過


測試數(shù)據(jù)庫

定義實(shí)體類 User

新建文件 model/user.go

根據(jù)開頭所述 user 表,故可定義如下實(shí)體類

type User struct {Id       int    `json:"id"`Username string `json:"username"`Password string `json:"password"`Role     int    `json:"role"`
}// 顯式指定表名
func (User) TableName() string {return "user"
}

service

打開文件 service/system/service_common.go

service 層內(nèi)簡單實(shí)現(xiàn)了查詢整張表的功能,并作了錯誤處理

type CommonService struct{}func (s *CommonService) CreateApi(c *gin.Context) (err error) {// 調(diào)用Find方法查詢表,將查詢成功與否的結(jié)果存到res變量var userList []model.Userres := global.G_DB.Find(&userList)// 判斷res是否出現(xiàn)了錯誤if errors.Is(res.Error, gorm.ErrRecordNotFound) {return errors.New("找不到這個元素")}// 如果沒錯,那就返回數(shù)據(jù)c.JSON(http.StatusOK, gin.H{"data": userList,})// 給api層傳遞一個errorreturn res.Error
}

api

打開文件 api/system/api_common.go

很簡單,調(diào)用 service,然后在 api 中處理錯誤并返回 JSON 數(shù)據(jù)(這一步也可以直接全部寫在 service 層里,此時就可以把該 api 層看做是 springboot 中的 controller 層了!)

import ("github.com/gin-gonic/gin""net/http"
)type CommonApi struct{}func (s *CommonApi) CreateApi(c *gin.Context) {err := commonService.CreateApi(c)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"status": err.Error(),})}
}

開始測試!

萬事俱備,只欠東風(fēng),打開你的 postman|apifox|apipost,請求以下看看結(jié)果吧!


http://www.risenshineclean.com/news/32473.html

相關(guān)文章:

  • 網(wǎng)站更新中打開免費(fèi)百度啊
  • 什么網(wǎng)站做的最好寧德市人民政府
  • 沈陽網(wǎng)站建設(shè)小志網(wǎng)站的推廣優(yōu)化
  • 重慶營銷網(wǎng)站建設(shè)平臺app001推廣平臺官網(wǎng)
  • 網(wǎng)站域名解析錯誤怎么辦seo與sem的關(guān)系
  • 網(wǎng)站建設(shè)技術(shù)規(guī)范河南省鄭州市金水區(qū)
  • 福州官網(wǎng)網(wǎng)站建設(shè)谷歌seo網(wǎng)站推廣怎么做優(yōu)化
  • 網(wǎng)頁公正流程有名的seo外包公司
  • 做網(wǎng)站推廣的方法58網(wǎng)絡(luò)推廣
  • 手機(jī)網(wǎng)站建設(shè)浩森宇特seo建站優(yōu)化
  • 鄭州外貿(mào)建站做推廣
  • 國家建設(shè)協(xié)會官方網(wǎng)站百度瀏覽器網(wǎng)頁版入口
  • 溫州微信網(wǎng)站開發(fā)抖音搜索seo軟件
  • php地方門戶新聞網(wǎng)站源碼卡點(diǎn)視頻軟件下載
  • 不懂編程如何做網(wǎng)站萬能推廣app
  • 怎么把網(wǎng)站做火網(wǎng)絡(luò)營銷管理系統(tǒng)
  • 安平縣外貿(mào)網(wǎng)站建設(shè)正規(guī)微商免費(fèi)推廣軟件
  • 可以做網(wǎng)站的渠道廊坊seo關(guān)鍵詞排名
  • 隨州公司做網(wǎng)站營銷案例分析報告模板
  • 網(wǎng)站建設(shè)一對一培訓(xùn)seo根據(jù)什么具體優(yōu)化
  • 網(wǎng)站風(fēng)格模板營銷策劃的六個步驟
  • 網(wǎng)站建設(shè)流程策劃方案前端培訓(xùn)哪個機(jī)構(gòu)靠譜
  • 南通市網(wǎng)站建設(shè)我的完凡科網(wǎng)
  • 建湖做網(wǎng)站尋找鄭州網(wǎng)站優(yōu)化公司
  • 男女做爰高清免費(fèi)網(wǎng)站關(guān)鍵詞代發(fā)包收錄
  • 寶安網(wǎng)站建設(shè)公司968seo培訓(xùn)網(wǎng)的優(yōu)點(diǎn)是
  • 做網(wǎng)站網(wǎng)頁維護(hù) 手機(jī)App 開發(fā)免費(fèi)打廣告網(wǎng)站
  • 網(wǎng)站托管適合中層管理的培訓(xùn)
  • 做網(wǎng)站是通過怎么掙錢一個新產(chǎn)品怎么推廣
  • 網(wǎng)頁設(shè)計 做網(wǎng)站的代碼制作網(wǎng)站大概多少錢