go语言使用Gin框架链接数据库

go语言使用Gin框架链接数据库

简介

本文讲解如何使用go语言链接数据库

以下是一些用Gin框架链接数据库的步骤:

假设您选择的数据库是MySQL,首先需要在系统中安装相应的MySQL数据库,并创建一个名为“testdb”的数据库。

  1. 安装go-sql-driver驱动程序。在命令行终端中键入以下命令:
go get github.com/go-sql-driver/mysql

输入下载之后可以看见的是,在go.sum里面就有了相关的包
在这里插入图片描述

  1. 导入所需的包。在代码文件的顶部,使用以下语句导入所需的包:
import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
)
  1. 创建数据库连接池对象。在main函数或自定义函数中,连接到MySQL数据库并创建一个新的数据库连接池。
func connectToDatabase() (*sql.DB, error) {
    
    
    // Set up the database source string.
    dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", username, password, host, port, dbname)

    // Create a database handle and open a connection pool.
    db, err := sql.Open("mysql", dataSourceName)
    if err != nil {
    
    
        return nil, err
    }

    // Check if our connection is alive.
    err = db.Ping()
    if err != nil {
    
    
        return nil, err
    }

    return db, nil
}
  1. 在router函数(或需链接数据库的任何其他函数)中创建一个新的连接,并从连接池获取连接。使用上述步骤中的connectToDatabase函数,在需要时调用它以获取与MySQL数据库的连接。以下是一个简单的示例:
func main() {
    
    
    // Connect to the database.
    db, err := connectToDatabase()
    if err != nil {
    
    
        log.Fatal(err)
    }

    // Close the database connection pool after the main function returns.
    defer db.Close()

    // Create a new Gin router instance.
    r := gin.Default()

    // ...

    // Serve HTTP requests using the Gin router.
    r.Run(":8080")
}

创建数据库

代码演示数据库

-- 创建 testdb 数据库
CREATE DATABASE testdb;

-- 使用 testdb 数据库空间
USE testdb;

-- 创建 users 表并插入2条数据
CREATE TABLE users (
  id INT(11) NOT NULL AUTO_INCREMENT,
  username VARCHAR(100) NOT NULL,
  email VARCHAR(100) NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO users (username, email) VALUES ('user1', '[email protected]');
INSERT INTO users (username, email) VALUES ('user2', '[email protected]');

这个MySQL数据库中包含了一个名为testdb的数据库,以及一个名为users的表。users表中包括三个字段:idusernameemail,其中id为主键,并自增。

可以使用MySQL客户端连接到该数据库(默认端口为3306),或者通过终端命令行使用以下命令查看该表中的数据:

USE testdb;
SELECT * FROM users;

输出应该如下所示:

+----+----------+------------------+
| id | username | email            |
+----+----------+------------------+
|  1 | user1    | [email protected] |
|  2 | user2    | [email protected] |
+----+----------+------------------+

完整代码

package main

import (
	"database/sql" // 数据库操作相关的包
	"fmt"
	"log" // 日志处理包

	"github.com/gin-gonic/gin" // Gin框架
	_ "github.com/go-sql-driver/mysql" // 加载MySQL驱动
)

const (
	username = "yourname"
	password = "yourpassword"
	host     = "localhost"
	port     = 3306
	dbname   = "testdb"
)

type user struct {
    
    
	ID       int    `json:"id"`
	Username string `json:"username"`
	Email    string `json:"email"`
}

// 连接数据库的函数。返回一个 *sql.DB 对象以及一个 error 对象 (如果连接不成功)。
func connectToDatabase() (*sql.DB, error) {
    
    
	dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", username, password, host, port, dbname)
	db, err := sql.Open("mysql", dataSourceName) // 打开名为 MySQL 的SQL数据库
	if err != nil {
    
    
		return nil, err
	}
	err = db.Ping() // 检查连接是否建立,以确保连接存活
	if err != nil {
    
    
		return nil, err
	}
	return db, nil
}

func main() {
    
    
	db, err := connectToDatabase() // 与 MySQL 数据库建立连接
	if err != nil {
    
    
		log.Fatal(err)
	}
	defer db.Close() // 延迟执行,确保在 main 函数退出时关闭数据库连接
	r := gin.Default() // 创建一个Gin路由器实例
	r.GET("/users/:id", func(c *gin.Context) {
    
     // 定义一个路由处理函数,用于从数据库中检索用户信息
		var (
			user   user  // 用户结构体,用于存储结果查询的记录
			result gin.H // Gin框架使用的Map集合类型,用于将结果渲染为 JSON 格式并发送给客户端
		)
		id := c.Param("id") // 获取参数id
		row := db.QueryRow("SELECT id, username, email FROM users WHERE id = ?", id) // 执行 SQL 查询,并返回*sql.Row对象,其中包含结果集的单行记录
		err = row.Scan(&user.ID, &user.Username, &user.Email) // 将行数据扫描到user 结构体内,分别对应结果集中的前3列(id,username,email)
		if err != nil {
    
    
			result = gin.H{
    
    
				"message": "User not found", // 如果错误则返回 error 消息
			}
		} else {
    
    
			result = gin.H{
    
    
				"data": user, //返回查询结果
			}
		}
		c.JSON(200, result) // 渲染result Map集合成JSON格式,并发送响应消息给客户端
	})
	r.Run(":8080") // 启动服务器并在本地机器上监听端口号为8080的请求
}

运行代码

在这里插入图片描述
测试成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51447496/article/details/130762946