Golang如何成功连接API与PostgreSQL
Golang如何成功连接API与PostgreSQL 我正在开发一个类似这样的API:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
)
func helloWorld(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
}
func handleRequests() {
myRouter := mux.NewRouter().StrictSlash(true)
myRouter.HandleFunc("/", helloWorld).Methods("GET")
myRouter.HandleFunc("/", AllUsers).Methods("GET")
myRouter.HandleFunc("/user/{name}/{age}", NewUser).Methods("POST")
log.Fatal(http.ListenAndServe(":8081", myRouter))
}
func main() {
fmt.Println("GO orm tut")
InitialMigration()
handleRequests()
}
这是我的 user.go 文件:
package main
import (
"encoding/json"
"fmt"
"net/http"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
var db *gorm.DB
var err error
type User struct {
gorm.Model
Name string
Email string
}
func InitialMigration() {
db, err = gorm.Open("postgres", "dbname=users sslmode=disable")
if err != nil {
fmt.Println(err.Error())
panic("Failed to connect to database")
}
defer db.Close()
db.AutoMigrate(&User{})
}
func AllUsers(w http.ResponseWriter, r *http.Request) {
db, err = gorm.Open("postgres", "users")
if err != nil {
panic("Could not connect to database")
}
defer db.Close()
var users []User
db.Find(&users)
json.NewEncoder(w).Encode(users)
}
func NewUser(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "User")
}
但是当我尝试发送 GET 请求到 http://localhost:8081/users 时,它没有任何返回。在 Postman 中它返回 404。
有人能帮我解决这个问题吗?
更多关于Golang如何成功连接API与PostgreSQL的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
myRouter.HandleFunc("/", helloWorld).Methods("GET")
myRouter.HandleFunc("/", AllUsers).Methods("GET")
myRouter.HandleFunc("/user/{name}/{age}", NewUser).Methods("POST")
你没有为 /users 路径设置处理程序。
更多关于Golang如何成功连接API与PostgreSQL的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码有几个关键问题导致API无法正常工作。主要问题包括路由不匹配、数据库连接管理不当以及缺少必要的依赖。以下是修正后的代码:
main.go:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
)
func helloWorld(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
}
func handleRequests() {
myRouter := mux.NewRouter().StrictSlash(true)
myRouter.HandleFunc("/", helloWorld).Methods("GET")
myRouter.HandleFunc("/users", AllUsers).Methods("GET") // 修正路由路径
myRouter.HandleFunc("/user/{name}/{email}", NewUser).Methods("POST") // 修正参数
log.Fatal(http.ListenAndServe(":8081", myRouter))
}
func main() {
fmt.Println("GO orm tut")
InitialMigration()
handleRequests()
}
user.go:
package main
import (
"encoding/json"
"fmt"
"net/http"
"github.com/gorilla/mux"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
var db *gorm.DB
var err error
type User struct {
gorm.Model
Name string
Email string
}
func InitialMigration() {
// 使用完整的连接字符串
db, err = gorm.Open("postgres", "host=localhost port=5432 user=postgres dbname=users password=yourpassword sslmode=disable")
if err != nil {
fmt.Println(err.Error())
panic("Failed to connect to database")
}
// 不要在这里关闭连接,因为main函数需要持续使用
// defer db.Close()
db.AutoMigrate(&User{})
}
func AllUsers(w http.ResponseWriter, r *http.Request) {
// 直接使用全局db变量,不需要重新打开连接
var users []User
db.Find(&users)
json.NewEncoder(w).Encode(users)
}
func NewUser(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
name := vars["name"]
email := vars["email"]
user := User{Name: name, Email: email}
db.Create(&user)
json.NewEncoder(w).Encode(user)
}
go.mod 文件需要包含以下依赖:
module your-module-name
go 1.19
require (
github.com/gorilla/mux v1.8.0
github.com/jinzhu/gorm v1.9.16
)
require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/lib/pq v1.10.7 // indirect
)
关键修正点:
- 路由路径从
/改为/users以匹配你的请求 - 数据库连接在
InitialMigration()中只建立一次,并在整个应用生命周期中保持打开 NewUser函数现在实际处理参数并创建用户记录- 连接字符串需要完整的PostgreSQL连接参数
运行前确保:
- PostgreSQL服务正在运行
- 已创建名为
users的数据库 - 使用
go mod tidy安装所有依赖
现在发送GET请求到 http://localhost:8081/users 应该能正确返回用户列表。

