Go语言学习笔记 (四)连接数据库

本文讲述了作者在使用Go语言和GORM库连接SQLServer数据库时遇到的问题,包括连接设置、模型映射以及字段大小写对查询结果的影响。作者最终解决了结构体字段与数据库列名大小写不一致导致的查询问题。
摘要由CSDN通过智能技术生成

学习这个耽误了很久,主要是一些go的特性没掌握,现在整理下,重新开始:

golang使用数据库,借鉴下大神的矿建 GORM,首先下载

go get github.com/jinzhu/gorm

然后创建数据库的目录,我链接的是sqlserver ,不过其他数据库都差不多
在这里插入图片描述
mssql.go 放置数据库的连接

package msql

import (
	"time"

	"gorm.io/driver/sqlserver"
	"gorm.io/gorm"

	"test/util/logs"
)

var client *gorm.DB

func InitSQLserver(url string) {
	db, err := gorm.Open(sqlserver.Open(url), &gorm.Config{})
	if err != nil {
		logs.PanicKvs("connect to sqlserver error", err)
	}

	sqlDB, err := db.DB()
	if err != nil {
		logs.PanicKvs("get client error", err)
	}
	// 连接池中空闲连接的最大数量
	sqlDB.SetMaxIdleConns(300)
	// 打开数据库连接的最大数量
	sqlDB.SetMaxOpenConns(500)
	// 连接可复用的最大时间
	sqlDB.SetConnMaxLifetime(time.Second * 30)

	client = db
}

func GetClient() *gorm.DB {
	return client
}

里面主要初始化连接(各个语言大同小异),和建立连接池

model下放了我的一个数据表的查询的方法:czyk.go

一开始下载了个例子,是连接数据表的,grom必须要有自己的基本结构:

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

这个可以在连接前自动创建,然后就可以实现增删改了,里面比较坑的是,如果表已经有了,你需要指定表名,如我i的表名是czyk,代码如下:

func (v czyk) TableName() string {
	return "czyk"
}

但是,我的数据库的表都是建好的,我不想再增加那么多的字段,难道不能直接写sql,然后自己试了下,写个结构体和自己需要返回的字段一样,sql的查询结果返回到这个结构体,基本可以理解,CTRL+C一段过来,自己改造下:


```go

```go
package model

import (
	mssql "test/storage/mssql"

	"gorm.io/gorm"
)

type czyk struct {
	czyid   string 
	czyname string 
	psd   string 
}

type userDao struct {
	sqlClient *gorm.DB
}

func NewUserDao() *userDao {
	return &userDao{
		sqlClient: mssql.GetClient(),
	}
}

func (d *userDao) GetUserByid(czyid string) (*czyk, error) {
	user := &czyk{}

	sqlstr := "SELECT czyid,czyname,psd FROM czyk (nolock) WHERE czyid= ?"
	//res := d.sqlClient.Where("czyid = ?", czyid).First(user)

	res := d.sqlClient.Raw(sqlstr, czyid).Scan(user)

	if res.Error == gorm.ErrRecordNotFound {
		return nil, nil
	}
	if res.Error != nil {
		return nil, res.Error
	}

	return user, nil
}

GetUserByid的函数就是查询数据表czyk,返回指定id 的数据,改造下上次写的user.go


```go
func Login(ctx *gin.Context) {
	data, _ := ctx.GetRawData()
	var body map[string]string
	_ = json.Unmarshal(data, &body)

	ud := sqlModel.NewUserDao()

	user, err := ud.GetUserByid(body["czyid"])

	if err == nil && user == nil {
		response.FailResult(-1, "用户不存在...", ctx)
	}
	if err != nil {
		response.FailResult(-255, err.Error(), ctx)
	}

	if user != nil && err == nil {
		if user.PSD != body["password"] {
			response.FailResult(-1, "用户密码错误...", ctx)
		} else {
			response.SuccessResult(user, ctx)
		}
	}

}

里面接口上获取json里面的czyid的值,并执行刚才写的函数,返回匹配的用户,然后比较密码 psd。
编译完全不报错,运行postman,然而返回的data里面是null,郁闷啊,跳来跳去,跟踪了N次都是null,就是获取的结构体user里面一直是“czyid=null,czyname=null,psd=null”搜了N个博客,没有结果,难道要放弃了?
最后看到一个博客说,结构体里面的字段要和数据表一致,做到了啊,都是复制进来的。还说了一嘴,要大写,呃!可以了。 看来标准的定义是这样的
和你数据表一致的字段名称要“大写”!

type czyk struct {
	CZYID   string `gorm:"column:czyid"`
	CZYNAME string `gorm:"column:czyname"`
	PSD     string `gorm:"column:psd`
}

再运行,好了
在这里插入图片描述
哎,使用其他语言带下来的习惯,看了是以后最大的坑

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值