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
)

关键修正点:

  1. 路由路径从 / 改为 /users 以匹配你的请求
  2. 数据库连接在 InitialMigration() 中只建立一次,并在整个应用生命周期中保持打开
  3. NewUser 函数现在实际处理参数并创建用户记录
  4. 连接字符串需要完整的PostgreSQL连接参数

运行前确保:

  1. PostgreSQL服务正在运行
  2. 已创建名为 users 的数据库
  3. 使用 go mod tidy 安装所有依赖

现在发送GET请求到 http://localhost:8081/users 应该能正确返回用户列表。

回到顶部