gpt4 book ai didi

mysql - 将数据库集成到 Go Web 应用程序中的最佳方式

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:52 24 4
gpt4 key购买 nike

我刚开始使用 Go 开发 Web 应用程序。我正在寻找将 MySQL 数据库集成到我的 Web 应用程序中的最佳方法。

我正在考虑做这样的事情:

type Context struct {
Database *sql.DB
}
// Some database methods like Close() and Query() for Context struct here

在我的 web 应用程序的主要功能中,我会有这样的东西:

db := sql.Open(...)
ctx := Context{db}

然后我会将我的 Context 结构传递给需要数据库连接的各种处理程序。这是一个好的设计决策还是有更好的方法将 SQL 数据库集成到我的 Web 应用程序中?

最佳答案

我通常会这样做:

package main

func main(){
db,err := sql.Open(...)
if err != nil {
log.Fatal(err)
}
defer db.Close()
http.HandleFunc("/feed", server.FeedHandler(db))
http.HandleFunc("/gui", server.GuiHandler(db))
...
log.Fatal(http.ListenAndServe(":8000", nil))
}

server 是一个单独的包,我在其中定义、实现和测试我所有的 http 处理程序。

这基本上就是您的想法,但跳过了将数据库包装在不必要的结构中的步骤。我建议将数据库设置为全局变量。具有全局依赖性将完全破坏以可靠方式测试 http 处理程序的任何可能性。

依赖注入(inject)数据库,如上例所示,每次调用该函数时都会额外输入两个字符,但它允许您使用 go-sqlmock package 轻松测试您的 http 处理程序随着您的网络应用程序的发展,您肯定希望这样做。

package server

func TestFeedHandler(t *testing.T){
mockdb, err := sqlmock.New()
if err != nil {
t.Errorf("An error '%s' was not expected when opening a stub database connection", err)
}

columns := []string{"id", "name"}
sqlmock.ExpectQuery("SELECT id,name from persons;").
WillReturnRows(sqlmock.NewRows(columns).
AddRow(1234, "bob")

handler := FeedHandler(mockdb)

// test that handler returns expected result

}

关于mysql - 将数据库集成到 Go Web 应用程序中的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com