ByteNoteByteNote

字节笔记本

2026年2月19日

Go + Gin + GORM + SQLite 构建 RESTful API

API中转
¥120

本文介绍一个使用 Go 语言、Gin 框架、GORM 和 SQLite3 构建的基础 RESTful API 示例,实现用户的 CRUD 操作。

项目简介

这是一个基础的 Go RESTful API 示例,由 EtienneR 创建。它展示了如何使用现代 Go 技术栈快速构建一个功能完整的用户管理 API。

Gist 地址: https://gist.github.com/EtienneR/ed522e3d31bc69a9dec3335e639fcf60 相关教程: Medium - How to create a basic RESTful API in Go 统计: 29 Stars, 11 Forks

技术栈

技术用途版本
GinHTTP Web 框架gin-gonic/gin
GORMORM 库jinzhu/gorm
SQLite3数据库mattn/go-sqlite3

项目结构

text
main.go
├── 数据库初始化
├── 数据模型定义
├── CORS 中间件
└── API 路由处理

完整代码

go
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
    "github.com/gin-contrib/cors"
)

// Users 用户模型
type Users struct {
    Id        int    `gorm:"AUTO_INCREMENT" form:"id" json:"id"`
    Firstname string `gorm:"not null" form:"firstname" json:"firstname"`
    Lastname  string `gorm:"not null" form:"lastname" json:"lastname"`
}

var db *gorm.DB

func main() {
    // 初始化数据库
    var err error
    db, err = gorm.Open("sqlite3", "./gorm.db")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    // 自动迁移
    db.AutoMigrate(&Users{})

    // 创建 Gin 路由
    r := gin.Default()

    // 配置 CORS
    config := cors.DefaultConfig()
    config.AllowAllOrigins = true
    config.AllowHeaders = []string{"Origin", "Content-Type"}
    r.Use(cors.New(config))

    // API 路由
    v1 := r.Group("api/v1")
    {
        v1.POST("/users", CreateUser)
        v1.GET("/users", GetUsers)
        v1.GET("/users/:id", GetUser)
        v1.PUT("/users/:id", UpdateUser)
        v1.DELETE("/users/:id", DeleteUser)
    }

    r.Run(":8080")
}

// CreateUser 创建用户
func CreateUser(c *gin.Context) {
    var user Users
    c.BindJSON(&user)

    db.Create(&user)
    c.JSON(201, user)
}

// GetUsers 获取所有用户
func GetUsers(c *gin.Context) {
    var users []Users
    db.Find(&users)
    c.JSON(200, users)
}

// GetUser 获取单个用户
func GetUser(c *gin.Context) {
    id := c.Params.ByName("id")
    var user Users

    if err := db.Where("id = ?", id).First(&user).Error; err != nil {
        c.AbortWithStatus(404)
        return
    }

    c.JSON(200, user)
}

// UpdateUser 更新用户
func UpdateUser(c *gin.Context) {
    id := c.Params.ByName("id")
    var user Users

    if err := db.Where("id = ?", id).First(&user).Error; err != nil {
        c.AbortWithStatus(404)
        return
    }

    c.BindJSON(&user)
    db.Save(&user)
    c.JSON(200, user)
}

// DeleteUser 删除用户
func DeleteUser(c *gin.Context) {
    id := c.Params.ByName("id")
    var user Users

    if err := db.Where("id = ?", id).Delete(&user).Error; err != nil {
        c.AbortWithStatus(404)
        return
    }

    c.JSON(204, gin.H{"id #" + id: "deleted"})
}

代码解析

1. 数据模型

go
type Users struct {
    Id        int    `gorm:"AUTO_INCREMENT" form:"id" json:"id"`
    Firstname string `gorm:"not null" form:"firstname" json:"firstname"`
    Lastname  string `gorm:"not null" form:"lastname" json:"lastname"`
}

标签说明:

  • gorm:"AUTO_INCREMENT": 自增主键
  • gorm:"not null": 非空约束
  • form:"firstname": 表单绑定字段
  • json:"firstname": JSON 序列化字段名

2. 数据库初始化

go
db, err = gorm.Open("sqlite3", "./gorm.db")
db.AutoMigrate(&Users{})
  • 使用 SQLite3 作为数据库
  • AutoMigrate 自动创建/更新表结构

3. CORS 配置

go
config := cors.DefaultConfig()
config.AllowAllOrigins = true
config.AllowHeaders = []string{"Origin", "Content-Type"}
r.Use(cors.New(config))

允许所有跨域请求,方便前端开发调试。

API 端点

方法路径功能
POST/api/v1/users创建用户
GET/api/v1/users获取所有用户
GET/api/v1/users/:id获取单个用户
PUT/api/v1/users/:id更新用户
DELETE/api/v1/users/:id删除用户

运行步骤

1. 安装依赖

bash
go get -u github.com/gin-gonic/gin
go get -u github.com/jinzhu/gorm
go get -u github.com/jinzhu/gorm/dialects/sqlite
go get -u github.com/gin-contrib/cors

2. 运行服务

bash
go run main.go

服务将在 http://localhost:8080 启动。

3. 测试 API

创建用户:

bash
curl -X POST http://localhost:8080/api/v1/users \
  -H "Content-Type: application/json" \
  -d '{"firstname":"John","lastname":"Doe"}'

获取所有用户:

bash
curl http://localhost:8080/api/v1/users

获取单个用户:

bash
curl http://localhost:8080/api/v1/users/1

更新用户:

bash
curl -X PUT http://localhost:8080/api/v1/users/1 \
  -H "Content-Type: application/json" \
  -d '{"firstname":"Jane","lastname":"Doe"}'

删除用户:

bash
curl -X DELETE http://localhost:8080/api/v1/users/1

扩展建议

添加数据验证

go
func CreateUser(c *gin.Context) {
    var user Users
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    if user.Firstname == "" || user.Lastname == "" {
        c.JSON(400, gin.H{"error": "firstname and lastname are required"})
        return
    }

    db.Create(&user)
    c.JSON(201, user)
}

添加分页

go
func GetUsers(c *gin.Context) {
    var users []Users

    page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
    limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))
    offset := (page - 1) * limit

    db.Limit(limit).Offset(offset).Find(&users)
    c.JSON(200, users)
}

使用环境变量

go
import "os"

port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}
r.Run(":" + port)

总结

这个 Gist 展示了一个简洁但完整的 Go RESTful API 实现,特点包括:

  • 简洁清晰:代码量少,易于理解
  • 现代技术栈:Gin + GORM + SQLite3
  • 完整 CRUD:涵盖增删改查所有操作
  • 跨域支持:内置 CORS 中间件
  • 易于扩展:结构清晰,方便添加功能

适合作为 Go Web 开发的入门示例或项目原型。

分享: