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

电话开发网站建设话术滨州五学一做考试网站

电话开发网站建设话术,滨州五学一做考试网站,公司怎么建立自己网站,dede网站不能运行php文件Go从入门到精通(23) 一个简单web项目-使用数据库存储数据 文章目录Go从入门到精通(23)前言安装依赖创建数据库模型配置数据库连接修改用户处理函数使用数据库修改主函数初始化数据库添加辅助函数配置环境变量插件与扩展小结gorm更多用法前言 GORM 是 Go 语言中最流行的 ORM&a…

Go从入门到精通(23)

一个简单web项目-使用数据库存储数据


文章目录

  • Go从入门到精通(23)
  • 前言
  • 安装依赖
  • 创建数据库模型
  • 配置数据库连接
  • 修改用户处理函数使用数据库
  • 修改主函数初始化数据库
  • 添加辅助函数
  • 配置环境变量
  • 插件与扩展
  • 小结
  • gorm更多用法


前言

GORM 是 Go 语言中最流行的 ORM(对象关系映射)库之一,用于简化数据库操作。它提供了直观的 API,支持主流数据库(如 MySQL、PostgreSQL、SQLite 等),并具备自动迁移、关联查询、事务管理等功能。


安装依赖

go get -u gorm.io/gorm
go get -u gorm.io/driver/postgres

创建数据库模型

// app/repository/models/user.go
package modelsimport ("time"
)// User 用户模型
type User struct {ID        string    `gorm:"primaryKey;size:36" json:"id"`Username  string    `gorm:"unique;not null;size:50" json:"username"`Password  string    `gorm:"not null" json:"-"` // 不返回密码Email     string    `gorm:"unique;not null;size:100" json:"email"`CreatedAt time.Time `json:"created_at"`UpdatedAt time.Time `json:"updated_at"`
}

配置数据库连接

数据库安装与使用自行查阅其他资料,这里不再讲解

package repositoryimport ("go-web-demo/app/repository/models""gorm.io/driver/mysql""gorm.io/driver/postgres""gorm.io/gorm""log""os"
)var DB *gorm.DBfunc InitGormDB() error {dsn := os.Getenv("DATABASE_DSN")if dsn == "" {// 默认使用 PostgreSQLdsn = "host=localhost user=postgres password=password dbname=user_db port=5432 sslmode=disable TimeZone=Asia/Shanghai"}var err errorvar dialect gorm.Dialector// 根据环境变量选择数据库驱动dbDriver := os.Getenv("DB_DRIVER")switch dbDriver {case "mysql":dialect = mysql.Open(dsn)default:dialect = postgres.Open(dsn)}DB, err = gorm.Open(dialect, &gorm.Config{})if err != nil {log.Fatalf("无法连接数据库: %v", err)return err}// 自动迁移模型if err := DB.AutoMigrate(&models.User{}); err != nil {log.Fatalf("数据库迁移失败: %v", err)return err}log.Println("数据库连接成功")return nil
}

修改用户处理函数使用数据库

// handlers/user_handlers.go
package handlersimport ("encoding/json""net/http""strings""golang.org/x/crypto/bcrypt""gorm.io/gorm""your-project/database""your-project/models"
)// 全局变量替换为数据库连接
// var users = make(map[string]models.User)
// var nextUserID = 1// RegisterHandler 注册新用户
func RegisterHandler(c *gin.Context) {var request dto.RegisterRequest// 绑定并验证请求if err := c.ShouldBindJSON(&request); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 检查用户名是否已存在var existingUser models.Userif err := repository.DB.Where("username = ?", request.Username).First(&existingUser).Error; err == nil {c.JSON(http.StatusConflict, gin.H{"error": "用户名已存在"})return} else if !errors.Is(err, gorm.ErrRecordNotFound) {c.JSON(http.StatusInternalServerError, gin.H{"error": "数据库错误"})return}// 哈希密码hashedPassword, err := bcrypt.GenerateFromPassword([]byte(request.Password), bcrypt.DefaultCost)if err != nil {logger.Sugar.Errorw("密码哈希失败", "error", err)c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"})return}// 创建新用户user := models.User{ID:        utils.GenerateUniqueID(), // 实现一个生成唯一ID的函数Username:  request.Username,Password:  string(hashedPassword),Email:     request.Email,CreatedAt: time.Now(),UpdatedAt: time.Now(),}// 保存到数据库if err := repository.DB.Create(&user).Error; err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": "创建用户失败"})return}// 生成令牌token, err := utils.GenerateToken(user.ID)if err != nil {logger.Sugar.Errorw("生成令牌失败", "error", err)c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to generate token"})return}c.JSON(http.StatusCreated, dto.TokenResponse{Token: token})
}// 其他处理函数类似修改...

修改主函数初始化数据库

// main.go
func main() {// 连接数据库if err := repository.InitGormDB(); err != nil {panic(err)}//.. 其他逻辑
}

添加辅助函数

// utils/utils.go
package utilsimport ("crypto/rand""encoding/hex""time""github.com/dgrijalva/jwt-go"
)// 生成唯一ID
func GenerateUniqueID() string {b := make([]byte, 16)rand.Read(b)return hex.EncodeToString(b)
}// 生成JWT令牌
func GenerateToken(userID string) (string, error) {token := jwt.New(jwt.SigningMethodHS256)claims := token.Claims.(jwt.MapClaims)claims["id"] = userIDclaims["exp"] = time.Now().Add(time.Hour * 24).Unix()return token.SignedString([]byte("your-secret-key"))
}

配置环境变量

根据自己环境配置,下面为例子

DATABASE_DSN=host=localhost user=postgres password=password dbname=user_db port=5432 sslmode=disable

插件与扩展

GORM 支持通过插件增强功能,例如:

  • gorm.io/plugin/dbresolver:读写分离、多数据库支持
  • gorm.io/plugin/soft_delete:软删除(逻辑删除)
  • gorm.io/plugin/optimisticlock:乐观锁实现

小结

上面的例子只是简单的说明gorm的用法,实际项目中使用可能会更加复杂,中大型项目可能会要求,数据库交互层(repository)独立,外部通过接口来调用,大家可自行实践。

gorm更多用法

更多的用法参考中文官网


文章转载自:

http://GNq2vCdA.bnkcL.cn
http://l6Nr1mbn.bnkcL.cn
http://5vKJiCea.bnkcL.cn
http://n02l09Ee.bnkcL.cn
http://NNkzzaxi.bnkcL.cn
http://OoQxn8J5.bnkcL.cn
http://sMJoqxgM.bnkcL.cn
http://S9oWSiHO.bnkcL.cn
http://YiDd5Fma.bnkcL.cn
http://1oLv6BeJ.bnkcL.cn
http://fTpFOUwM.bnkcL.cn
http://XuSZGD4X.bnkcL.cn
http://58xeaLJg.bnkcL.cn
http://emn4Esoc.bnkcL.cn
http://ccSzA6gM.bnkcL.cn
http://iHg270rN.bnkcL.cn
http://QnPU7fQi.bnkcL.cn
http://sNwyPzyl.bnkcL.cn
http://Lb1B6O0D.bnkcL.cn
http://g1a5Cv0b.bnkcL.cn
http://ZgGtpxQd.bnkcL.cn
http://DqJ97Gua.bnkcL.cn
http://REGASRIt.bnkcL.cn
http://jOyTbsuS.bnkcL.cn
http://qq99LDCv.bnkcL.cn
http://CpuZJszj.bnkcL.cn
http://IJmIjXUf.bnkcL.cn
http://FHM4NYP7.bnkcL.cn
http://Rt1Zycbo.bnkcL.cn
http://E3gBrNat.bnkcL.cn
http://www.dtcms.com/wzjs/703862.html

相关文章:

  • 网站排名怎么提升浅谈全球五金网电子商务网站建设
  • wordpress资源站邢台123生活信息
  • 做二手网站威海市住房和城乡建设局网站
  • 中企动力做网站费用申请网站建设经费的请示
  • 昆明北京网站建设网站建设的心得与体会
  • 微信 app 微网站 整合h5自助建站系统
  • 公司网站开发技巧做板子焊接的网站的公司名字
  • 房地产公司网站建设pptxyz域名
  • 建设银行 网站怎么打不开了网站登录接口怎么做
  • oa网站建设物业企业信息管理系统
  • 汕头市建设局造价信息网站电器企业网站建站
  • 家具网站建设案例wordpress免插件图床
  • 测网站打开的速度的网址石家庄免费专业做网站
  • 关于公司做网站供比价报告企业网上登记注册
  • 女装网站建设规划医院线上预约
  • 网站怎么会k如果网站没有做icp备案
  • 网站如何防止重登录设计师服务平台网
  • 营销型网站建设区别王也高清头像
  • 咨询类网站建设网页制作标题设置步骤
  • 网站开发后怎么上线如何自己设计创建一个网站
  • 网站如何做质保系统广点通广告平台
  • 做网站需要的软件前几年做那个网站能致富
  • 长春搜索引擎网站推广黄冈论坛遗爱网
  • 北京 网站建设 公东莞网站建设的公司
  • 营销型网站建设要点o2o网站建设效果
  • 长春网站建设方案托管做网站的外包公司上班好不好
  • 南京网站建设学习做网站网站是什么案件
  • 深圳网站建设找哪家公司wordpress的站点地址和
  • 网站上面怎么做链接做网站用python还是php
  • 企业形象网站开发seo排名优化排行