在Go语言中使用Gin框架进行Web开发时,你可以轻松地结合database/sql
接口和具体的数据库驱动(如MySQL的go-sql-driver/mysql
)来执行数据的增删查改(CRUD)操作。下面通过几个简单的例子展示如何使用Gin和MySQL进行基本的数据操作。
1. 安装依赖
确保你已经安装了必要的依赖:
go get -u github.com/gin-gonic/gin
go get -u github.com/go-sql-driver/mysql
2. 设置数据库连接
首先设置数据库连接,参考之前的说明。
3. CRUD 操作示例
创建(Create)
创建一条新记录的例子:
func createUser(c *gin.Context) {
var user struct {
Name string `json:"name"`
Age int `json:"age"`
}
if err := c.ShouldBindJSON(&user); err == nil {
result, err := db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", user.Name, user.Age)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
id, _ := result.LastInsertId()
c.JSON(http.StatusOK, gin.H{"id": id})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
读取(Read)
查询所有用户或根据ID查询用户的例子:
func getUsers(c *gin.Context) {
rows, err := db.Query("SELECT id, name, age FROM users")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
defer rows.Close()
var users []map[string]interface{}
for rows.Next() {
var id int
var name string
var age int
if err := rows.Scan(&id, &name, &age); err != nil {
continue
}
user := map[string]interface{}{
"id": id,
"name": name,
"age": age,
}
users = append(users, user)
}
c.JSON(http.StatusOK, users)
}
func getUserByID(c *gin.Context) {
id := c.Params.ByName("id")
var user map[string]interface{}
err := db.QueryRow("SELECT id, name, age FROM users WHERE id=?", id).Scan(&user["id"], &user["name"], &user["age"])
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
return
}
c.JSON(http.StatusOK, user)
}
更新(Update)
更新用户的例子:
func updateUser(c *gin.Context) {
id := c.Params.ByName("id")
var user struct {
Name string `json:"name"`
Age int `json:"age"`
}
if err := c.ShouldBindJSON(&user); err == nil {
_, err := db.Exec("UPDATE users SET name=?, age=? WHERE id=?", user.Name, user.Age, id)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "User updated"})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
删除(Delete)
删除用户的例子:
func deleteUser(c *gin.Context) {
id := c.Params.ByName("id")
_, err := db.Exec("DELETE FROM users WHERE id=?", id)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "User deleted"})
}
4. 路由设置
最后,不要忘记为这些函数配置路由:
r := gin.Default()
r.POST("/users", createUser)
r.GET("/users", getUsers)
r.GET("/users/:id", getUserByID)
r.PUT("/users/:id", updateUser)
r.DELETE("/users/:id", deleteUser)
r.Run(":8080")
以上代码提供了一个基础的CRUD操作指南,实际应用中可能需要根据具体需求进行适当调整,例如添加更多的错误处理、输入验证等。