使用Golang快速构建CRUD API的最佳方法!

使用Golang快速构建CRUD API的最佳方法! 你好,

我写了一篇Medium文章,在其中我使用不到50行代码就创建了一个以MySQL为数据库的CRUD API!我使用了GoFr,你可以在这里找到它。

查看文章请点击这里。

GoFr还具备许多功能,旨在展示如何仅通过专注于核心业务逻辑来构建可用于生产环境的应用程序。

谢谢,希望你觉得有用!

仓库:https://github.com/gofr-dev/gofr 网站:https://gofr.dev

1 回复

更多关于使用Golang快速构建CRUD API的最佳方法!的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用GoFr框架构建CRUD API确实非常高效。以下是一个完整的示例,展示如何用GoFr实现MySQL的CRUD操作:

package main

import (
    "gofr.dev/pkg/gofr"
)

type Product struct {
    ID    int     `json:"id"`
    Name  string  `json:"name"`
    Price float64 `json:"price"`
}

func main() {
    app := gofr.New()

    // 创建表(如果不存在)
    app.Migrate(func() {
        app.DB().Exec(`CREATE TABLE IF NOT EXISTS products (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(100) NOT NULL,
            price DECIMAL(10,2) NOT NULL
        )`)
    })

    // 创建产品
    app.POST("/products", func(c *gofr.Context) (interface{}, error) {
        var p Product
        if err := c.Bind(&p); err != nil {
            return nil, err
        }

        result, err := c.DB().ExecContext(c, 
            "INSERT INTO products (name, price) VALUES (?, ?)", 
            p.Name, p.Price)
        if err != nil {
            return nil, err
        }

        id, _ := result.LastInsertId()
        p.ID = int(id)
        return p, nil
    })

    // 获取所有产品
    app.GET("/products", func(c *gofr.Context) (interface{}, error) {
        var products []Product
        
        rows, err := c.DB().QueryContext(c, "SELECT id, name, price FROM products")
        if err != nil {
            return nil, err
        }
        defer rows.Close()

        for rows.Next() {
            var p Product
            if err := rows.Scan(&p.ID, &p.Name, &p.Price); err != nil {
                return nil, err
            }
            products = append(products, p)
        }

        return products, nil
    })

    // 获取单个产品
    app.GET("/products/{id}", func(c *gofr.Context) (interface{}, error) {
        id := c.PathParam("id")
        var p Product

        err := c.DB().QueryRowContext(c, 
            "SELECT id, name, price FROM products WHERE id = ?", id).
            Scan(&p.ID, &p.Name, &p.Price)
        if err != nil {
            return nil, err
        }

        return p, nil
    })

    // 更新产品
    app.PUT("/products/{id}", func(c *gofr.Context) (interface{}, error) {
        id := c.PathParam("id")
        var p Product
        
        if err := c.Bind(&p); err != nil {
            return nil, err
        }

        _, err := c.DB().ExecContext(c,
            "UPDATE products SET name = ?, price = ? WHERE id = ?",
            p.Name, p.Price, id)
        if err != nil {
            return nil, err
        }

        p.ID, _ = strconv.Atoi(id)
        return p, nil
    })

    // 删除产品
    app.DELETE("/products/{id}", func(c *gofr.Context) (interface{}, error) {
        id := c.PathParam("id")
        
        _, err := c.DB().ExecContext(c, "DELETE FROM products WHERE id = ?", id)
        if err != nil {
            return nil, err
        }

        return map[string]string{"message": "Product deleted successfully"}, nil
    })

    app.Run()
}

配置数据库连接(configs/.env):

DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=password
DB_NAME=testdb
DB_DIALECT=mysql

GoFr自动处理数据库连接池、配置管理、日志记录和健康检查。这个示例包含了完整的CRUD端点,每个操作都直接使用c.DB()访问数据库连接,框架自动管理事务和连接生命周期。

运行应用:

go run main.go

API端点:

  • POST /products - 创建产品
  • GET /products - 获取所有产品
  • GET /products/{id} - 获取单个产品
  • PUT /products/{id} - 更新产品
  • DELETE /products/{id} - 删除产品

GoFr内置了Swagger文档、指标收集和结构化日志,这些功能在生产环境中很有价值。

回到顶部