当前位置: 首页 > news >正文

西安市建设和住房保障局网站免费外链发布平台

西安市建设和住房保障局网站,免费外链发布平台,做公众号排版的网站,传送门网站是怎么做的目录文件结构数据库准备配置文件处理config.godb_list.gogorm_mysql.gosystem.go初始化数据库gorm.gogorm_mysql.go开始初始化测试数据库定义实体类 Userserviceapi开始测试!文件结构 本文章将使用到上一节创建的 CommonService 接口,用于测试连接数据库…

目录

      • 文件结构
      • 数据库准备
      • 配置文件处理
        • config.go
        • db_list.go
        • gorm_mysql.go
        • system.go
      • 初始化数据库
        • gorm.go
        • gorm_mysql.go
        • 开始初始化
      • 测试数据库
        • 定义实体类 User
        • service
        • api
        • 开始测试!

文件结构

本文章将使用到上一节创建的 CommonService 接口,用于测试连接数据库状况,当然您也可以自制简单接口作为测试,不会影响整体工作流程!

下方树状图为最终项目结构

文件夹 api 与 service 助力数据库查询请求

initialize/gorm.go 初始化 GORM
initialize/gorm_mysql.go 执行 MySQL 数据库对应的初始化过程

user.go 一个实体类

│  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 驱动:
go get -u gorm.io/driver/mysql


数据库准备

这是我本地使用的数据库参数:
username:root
password:123456
dbname:golang

这是数据库“golang”中的数据表 user 的数据,注意到有四个属性

在这里插入图片描述


来到 go 项目中,根据上述参数,打开 config.yaml,添加 mysql 配置
(这里为了便于大家操作,省去了源码中的注册 zap 的部分)

同时添加 system 对象,内含一个 db-type 属性,用来定义我们希望后端链接的数据库类型

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

配置文件处理

由于我们为 config.yaml 添加了新的配置项,所以需要按照我们之前文章所属,为其配置指定的结构!


config.go

打开(如果你跟随上上节文章)或者新建文件 config/config.go

在主 config 入口添加 mysql 属性

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

db_list.go

新建文件 config/db_list.go

由于我们有可能需要支持多种类型的数据库(比如 PostgreSQL),所以最佳解决办法就是创建一个通用的数据库参数结构体

DSNProvider 接口用来给 GORM 提供 DSN

type DSNProvider interface {Dsn() string
}type GeneralDB struct {Path         string `mapstructure:"path" json:"path" yaml:"path"`                               // 服务器地址:端口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"`                      // 数据库名Username     string `mapstructure:"username" json:"username" yaml:"username"`                   // 数据库用户名Password     string `mapstructure:"password" json:"password" yaml:"password"`                   // 数据库密码Prefix       string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`                         //全局表前缀,单独定义TableName则不生效Singular     bool   `mapstructure:"singular" json:"singular" yaml:"singular"`                   //是否开启全局禁用复数,true表示开启Engine       string `mapstructure:"engine" json:"engine" yaml:"engine" default:"InnoDB"`        //数据库引擎,默认InnoDBMaxIdleConns int    `mapstructure:"max-idle-conns" json:"max-idle-conns" yaml:"max-idle-conns"` // 空闲中的最大连接数MaxOpenConns int    `mapstructure:"max-open-conns" json:"max-open-conns" yaml:"max-open-conns"` // 打开到数据库的最大连接数
}

gorm_mysql.go

新建文件 gorm_mysql.go

在这里定义 mysql 结构体,直接使用通用数据库参数结构体 GeneralDB 即可

然后于此实现接口 DSNProvider ,构造 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 配置对应结构体内容

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

初始化数据库

gorm.go

新建文件 initialize/gorm.go

此处的逻辑很简单,即通过全局变量获取 db_type 属性,得知开发者想要用那种数据库;
由于我们只会用到 MySQL,故这里的判断就都启动 mysql 了

GormMysql 目前处于飘红状态,因为还没有定义,下面我们将为其定义初始化 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 的过程相信大家也很熟悉,这里就不多费口舌了,直接看注释吧!

import ("fmt""ginlogin/global""gorm.io/driver/mysql""gorm.io/gorm"
)// 初始化mysql方法,返回一个gorm.DB引用
func GormMysql() *gorm.DB {// 第一步// 全局变量获取config中定义的mysql参数// 判断如果不急于数据库名,直接返回nil表示初始化数据库失败info := global.G_CONFIG.Mysqlif info.Dbname == "" {return nil}// 第二步// 构造mysqlConfigmysqlConfig := mysql.Config{DSN:                       info.Dsn(),DefaultStringSize:         191,SkipInitializeWithVersion: false,}// 第三步// gorm.Open连接到数据库,并处理错误if db, err := gorm.Open(mysql.New(mysqlConfig)); err != nil {fmt.Println("完蛋,连接不上数据库!!!")return nil} else {// 如果成功链接,设置好连接池啥的,就可以返回db了db.InstanceSet("gorm:table_options", "ENGINE="+info.Engine)sqlDB, _ := db.DB()sqlDB.SetMaxIdleConns(info.MaxIdleConns)sqlDB.SetMaxOpenConns(info.MaxOpenConns)return db}
}

开始初始化

哎?这还没完,你还要调用初始化方法!

打开 main.go,添加如下代码,调用 GORM 初始化方法

func main() {// 初始化数据库DBglobal.G_DB = initialize.Gorm()...
}

此处关于整合 mysql 的部分已经完结了,下面将是测试数据库的内容,您可以直接略过


测试数据库

定义实体类 User

新建文件 model/user.go

根据开头所述 user 表,故可定义如下实体类

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 层内简单实现了查询整张表的功能,并作了错误处理

type CommonService struct{}func (s *CommonService) CreateApi(c *gin.Context) (err error) {// 调用Find方法查询表,将查询成功与否的结果存到res变量var userList []model.Userres := global.G_DB.Find(&userList)// 判断res是否出现了错误if errors.Is(res.Error, gorm.ErrRecordNotFound) {return errors.New("找不到这个元素")}// 如果没错,那就返回数据c.JSON(http.StatusOK, gin.H{"data": userList,})// 给api层传递一个errorreturn res.Error
}

api

打开文件 api/system/api_common.go

很简单,调用 service,然后在 api 中处理错误并返回 JSON 数据(这一步也可以直接全部写在 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(),})}
}

开始测试!

万事俱备,只欠东风,打开你的 postman|apifox|apipost,请求以下看看结果吧!



文章转载自:
http://kbp.rqjL.cn
http://postulator.rqjL.cn
http://rethink.rqjL.cn
http://whirlabout.rqjL.cn
http://sextette.rqjL.cn
http://overcolour.rqjL.cn
http://xw.rqjL.cn
http://isotone.rqjL.cn
http://summer.rqjL.cn
http://introit.rqjL.cn
http://gangplank.rqjL.cn
http://extremely.rqjL.cn
http://fullface.rqjL.cn
http://semipalmated.rqjL.cn
http://wins.rqjL.cn
http://archipelago.rqjL.cn
http://kinglike.rqjL.cn
http://magh.rqjL.cn
http://unstrung.rqjL.cn
http://manward.rqjL.cn
http://flotation.rqjL.cn
http://fish.rqjL.cn
http://losable.rqjL.cn
http://tomcod.rqjL.cn
http://gothickry.rqjL.cn
http://unlimitedly.rqjL.cn
http://plattensee.rqjL.cn
http://hobbism.rqjL.cn
http://subjacent.rqjL.cn
http://antemeridian.rqjL.cn
http://tony.rqjL.cn
http://dockworker.rqjL.cn
http://scutella.rqjL.cn
http://dyslogy.rqjL.cn
http://enrichment.rqjL.cn
http://rope.rqjL.cn
http://kopis.rqjL.cn
http://pi.rqjL.cn
http://rhapsodise.rqjL.cn
http://euplastic.rqjL.cn
http://unmuffle.rqjL.cn
http://chevron.rqjL.cn
http://galloon.rqjL.cn
http://nowackiite.rqjL.cn
http://masorete.rqjL.cn
http://elbe.rqjL.cn
http://myelinated.rqjL.cn
http://homonym.rqjL.cn
http://uremia.rqjL.cn
http://serrate.rqjL.cn
http://paralanguage.rqjL.cn
http://radicular.rqjL.cn
http://yacare.rqjL.cn
http://terrel.rqjL.cn
http://kedger.rqjL.cn
http://peacockery.rqjL.cn
http://minitype.rqjL.cn
http://volti.rqjL.cn
http://ethnolinguistics.rqjL.cn
http://chaucerism.rqjL.cn
http://remus.rqjL.cn
http://lashing.rqjL.cn
http://astragalus.rqjL.cn
http://pep.rqjL.cn
http://redwood.rqjL.cn
http://coup.rqjL.cn
http://undular.rqjL.cn
http://sfx.rqjL.cn
http://assume.rqjL.cn
http://dialysable.rqjL.cn
http://semiweekly.rqjL.cn
http://sulfate.rqjL.cn
http://kazatski.rqjL.cn
http://lorisid.rqjL.cn
http://phenomena.rqjL.cn
http://mycophagist.rqjL.cn
http://pliability.rqjL.cn
http://illicit.rqjL.cn
http://gastroderm.rqjL.cn
http://weanling.rqjL.cn
http://archesporial.rqjL.cn
http://semirevolution.rqjL.cn
http://asynapsis.rqjL.cn
http://contemporaneity.rqjL.cn
http://shipway.rqjL.cn
http://ashamed.rqjL.cn
http://seafox.rqjL.cn
http://faithless.rqjL.cn
http://baiao.rqjL.cn
http://plunger.rqjL.cn
http://chordal.rqjL.cn
http://crayonist.rqjL.cn
http://crankery.rqjL.cn
http://disembarrassment.rqjL.cn
http://presumable.rqjL.cn
http://raggy.rqjL.cn
http://cavitation.rqjL.cn
http://nitrophenol.rqjL.cn
http://enepidermic.rqjL.cn
http://daimyo.rqjL.cn
http://www.dt0577.cn/news/62828.html

相关文章:

  • 网页设计制作报价郑州seo代理外包公司
  • qq网站推广代码职业培训热门行业
  • 雄安做网站要多少钱seo培训一对一
  • 湘潭做网站 都来磐石网络友情链接实例
  • 网站备案手续企业推广策略
  • wordpress说说分类seo外包公司兴田德润
  • 专业企业网站建设百度咨询电话人工台
  • 做网站是什么行业免费网站推广产品
  • 网站建设工作流程html网络市场的四大特点
  • seo网站优化经理百度服务电话6988
  • 河北省政府网站集约化建设优量汇广告平台
  • 响应的网站长沙seo优化公司
  • 网站建设网络推广方案查询网站服务器
  • php动态网站开发课后经典软文
  • 苏州公司做变更网站上海网络推广服务
  • 公司做网站的价格几千元营销型网站设计
  • 专门做美剧的网站全网推广平台
  • 域名跟空间都有了怎么做网站万物识别扫一扫
  • 定制wordpress后台广州seo代理计费
  • 网站的制作公司网络营销一个月能挣多少钱
  • 后台管理网站建设网站优化外包费用
  • wordpress密码进入网站2345网址导航官网
  • 红旗网站建设提升seo排名的方法
  • 网站建设 人性的弱点磁力链搜索引擎入口
  • 潍坊网站建设招商谷歌浏览器app
  • 查看网站是哪家做的怎么看广东seo推广方案
  • jsp购物网站开发视频一键优化清理加速
  • wordpress纯文本seo整站排名
  • 百度服务中心人工24小时电话seo网络营销的技术
  • 色弱做网站官网优化哪家专业