目录
在构建个人博客系统时,我们需要一个后端服务来处理各种请求,如获取文章列表,获取文章详情,发布文章,编辑文章等。在这篇博客中,我将教你如何使用 Go 语言和 MySQL 数据库来创建这样的后端服务。
创建数据库表
首先,我们需要在 MySQL 中创建一个新的数据库和表来存储我们的文章数据。假设我们的数据库名为 blog
,我们的表名为 articles
,我们可以使用以下的 SQL 语句来创建这个表:
CREATE DATABASE blog;
USE blog;
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
在这个表中,我们有 5 个字段:id
,title
,content
,created_at
和 updated_at
。id
是主键,自动递增。title
和 content
用于存储文章的标题和内容。created_at
和 updated_at
用于存储文章的创建时间和更新时间。
连接数据库
然后,我们需要在 Go 程序中连接到这个数据库。我们可以使用 database/sql
包和 github.com/go-sql-driver/mysql
包来实现这个功能。首先,我们需要导入这两个包:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
然后,我们可以在 main
函数中创建一个新的数据库连接:
func main() {
db, err := sql.Open("mysql", "user:password@/blog")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// other code
}
在这段代码中,我们使用 sql.Open
函数创建一个新的数据库连接。这个函数需要两个参数:驱动名和数据源名。驱动名为 mysql
,数据源名的格式为 user:password@/dbname
。如果连接失败,我们使用 log.Fatal
函数打印错误信息并退出程序。最后,我们使用 defer
语句确保数据库连接在 main
函数返回时被关闭。
实现 CRUD 操作
接下来,我们需要实现 CRUD(创建,读取,更新,删除)操作。首先,我们需要在 main.go
文件中定义一个新的结构体 Article
来表示文章:
type Article struct {
ID int
Title string
Content string
CreatedAt time.Time
UpdatedAt time.Time
}
然后,我们可以实现以下的函数来进行 CRUD 操作:
func getArticles(db *sql.DB) ([]Article, error) {
rows, err := db.Query("SELECT * FROM articles")
if err != nil {
return nil, err
}
defer rows.Close()
var articles []Article
for rows.Next() {
var a Article
if err := rows.Scan(&a.ID, &a.Title, &a.Content, &a.CreatedAt, &a.UpdatedAt); err != nil {
return nil, err
}
articles = append(articles, a)
}
return articles, nil
}
func getArticle(db *sql.DB, id int) (Article, error) {
var a Article
err := db.QueryRow("SELECT * FROM articles WHERE id = ?", id).Scan(&a.ID, &a.Title, &a.Content, &a.CreatedAt, &a.UpdatedAt)
return a, err
}
func createArticle(db *sql.DB, title, content string) (int, error) {
res, err := db.Exec("INSERT INTO articles (title, content) VALUES (?, ?)", title, content)
if err != nil {
return 0, err
}
id, err := res.LastInsertId()
return int(id), err
}
func updateArticle(db *sql.DB, id int, title, content string) error {
_, err := db.Exec("UPDATE articles SET title = ?, content = ? WHERE id = ?", title, content, id)
return err
}
func deleteArticle(db *sql.DB, id int) error {
_, err := db.Exec("DELETE FROM articles WHERE id = ?", id)
return err
}
在这些函数中,我们使用 db.Query
,db.QueryRow
和 db.Exec
函数来执行 SQL 语句,并使用 rows.Scan
和 row.Scan
函数来将结果赋值给变量。
处理跨域请求
最后,我们需要处理跨域请求。为了实现这个功能,我们可以使用一个名为 github.com/gin-contrib/cors
的中间件。首先,我们需要安装这个中间件:
go get github.com/gin-contrib/cors
然后,我们可以在 main
函数中使用这个中间件:
import (
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.Use(cors.Default())
// other code
}
在这段代码中,我们使用 gin.Default
函数创建一个新的路由器,并使用 r.Use
函数添加 cors.Default
中间件。这个中间件会自动处理所有的跨域请求。
以上就是使用 Go 和 MySQL 创建后端服务的全部内容。希望这篇博客对你有所帮助。如果你有任何疑问,欢迎在评论区留言。