分享免费的编程资源和教程

网站首页 > 技术教程 正文

3. 使用Go语言编写个人博客 编写数据库连接与用户模型

goqiw 2024-10-22 13:46:09 技术教程 25 ℃ 0 评论

上一节我们创建好了程序的目录。现在开始编写代码,先从程序入口main.go开始编写。

package main

import (
	"xblog/models"
)

func main() {
	models.InitDB()
}

package main 声明当前代码属于 main 包。main 包是 Go 程序的入口点,程序从 main 包的 main 函数开始执行。

import 语句用于导入其他包的代码。本示例中,导入 xblog/models。

  • xblog/models 包定义了数据模型。

func main() 是 main 包的入口函数。程序从 main 函数开始执行。

  • models.InitDB() 函数用于初始化数据库连接。

接下来编写InitDB函数,在models目录下新建db.go文件,代码:

package models

import (
	"fmt"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB

func InitDB() {
	// 从环境变量获取数据库连接信息
	host := os.Getenv("DB_HOST")
	port := os.Getenv("DB_PORT")
	user := os.Getenv("DB_USER")
	password := os.Getenv("DB_PASSWORD")
	dbName := os.Getenv("DB_NAME")

	// 连接数据库
	dns := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		user,
		password,
		host,
		port,
		dbName,
	)

	db, err := gorm.Open(mysql.Open(dns), &gorm.Config{
		DisableForeignKeyConstraintWhenMigrating: true,
	})

	if err != nil {
		fmt.Println("连接数据库失败,请检查参数:", err)
		os.Exit(1)
	}

	err = db.AutoMigrate(&User{})
	if err != nil {
		fmt.Printf("数据库迁移失败:%v", err)
		os.Exit(1)
	}

	DB = db
}

package models 声明当前代码属于 models 包。models 包通常用于定义数据模型。

这里我导入了接下来要用到的4个包:

  • fmt 包:用于格式化输出
  • os 包:用于操作环境变量
  • gorm.io/driver/mysql 包:用于连接 MySQL 数据库,也被称为数据库驱动。
  • gorm.io/gorm 包:用于操作数据库

var DB *gorm.DB 声明全局变量 DB,用于存储数据库连接。注意Go语言中变量的大小写决定了变量是否可以被导出。

InitDB()函数用于初始化数据库连接。

os.Getenv函数可以从环境变量中获取数据库的连接信息,包括数据库地址、端口、用户名、密码和数据库名。

环境变量根据你使用的操作系统的不同它的配置会有些许的区别,本项目中我使用的是Linux发行版是Ubuntu Jammy。环境变量配置如下:

打开用户家目录下的.bashrc文件添加如下内容:

export DB_HOST=x.x.x.x // 把x.x.x.x替换为运行MySQL的主机IP

export DB_PORT=3306

export DB_USER=user

export DB_PASSWORD=password

export DB_NAME=dbname

保存退出,在终端中执行:source ~/.bashrc环境变量就配置好了。

dns 构造MySQL连接的DSN(数据源名称)。它使用了之前从环境变量中获取到的值

接下来使用GORM尝试打开一个新的数据库连接。gorm.Open函数接受两个参数:一个是数据库驱动和DSN的组合,一个是GORM的配置对象。

上面代码中第1个if语句是检查连接数据库时是否返回错误。如果有错误,输出错误信息并退出程序。err = db.AutoMigrate(&User{})调用GORM的AutoMigrate函数尝试自动迁移User结构体所对应的表结构。第2个if语句判断如果有错误,输出错误信息并退出程序。

DB = db 如果数据库连接成功,并且数据迁移没有错误,则将db(数据库连接对象)赋值给全局变量DB。

在models目录下新建user.go文件,代码:

package models

import (
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Username string `gorm:"type:varchar(20);not null" json:"username"`
	Password string `gorm:"type:varchar(256);not null" json:"password"`
	Email    string `gorm:"type:varchar(64);not null" json:"email"`
	Role     int    `gorm:"type:int;DEFAULT:1" json:"role"`
}

type User struct 这段代码定义了用户模型User的结构。它继承了gorm.Model,这是GORM内置的基本模型,包含了ID, CreatedAt, UpdatedAt, DeletedAt等字段。Username, Password, Email, Role是用户表的额外字段,每个字段后的标签指定了数据库中字段的类型(如varchar和int)、大小限制和其他约束(比如not null)、以及对应的JSON属性名。

当我们完成上述代码之后你会发现IDE出现了几个错误提示,如下图:

这是因为还未初始化 Go 模块。在终端中输入go mod init xblog完成初始化。如下图:

提示还有2个错误,不能导入"gorm.io/driver/mysql","gorm.io/gorm"。这时可以使用go mod tidy 命令解决此问题。go mod tidy 命令用于整理 Go 模块的依赖关系。它可以自动添加、删除和更新依赖关系,以确保模块的依赖关系是最新且一致的。

好,接下来让我运行一下程序,在终端中输入go run main.go

好,程序成功运行,没有报错。让我们登陆数据库看一下。

由图可以看出,程序根据User模型成功创建了users表。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表