学习这个耽误了很久,主要是一些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`
}
再运行,好了
哎,使用其他语言带下来的习惯,看了是以后最大的坑