Golang连接数据库失败问题求助

Golang连接数据库失败问题求助 我正在开发一个CRUD API,当我使用 go run main.go 运行应用程序时,遇到了这个错误。

[ORM]2020/02/18 21:25:50 register db Ping `default`, dial tcp: lookup dbHost: no such host
must have one register DataBase alias named `default`
exit status 2

以下是我的代码。我有一个模型文件夹,其中包含这些文件 models/db.gomodels/users.go

package models

import (
	"github.com/astaxie/beego/orm"
	_ "github.com/lib/pq" //PostgreSQL Driver
)

var ormObject orm.Ormer

// ConnectToDb - 初始化ORM并连接到PostgreSQL数据库
func ConnectToDb() {
	orm.RegisterDriver("postgres", orm.DRPostgres)
	orm.RegisterDataBase("default", "postgres", "user=postges password=postgres dbname=elixirapi_dev host=dbHost sslmode=disable")
	orm.RegisterModel(new(Users))
	ormObject = orm.NewOrm()
}

// GetOrmObject - 获取ORM对象的函数,我们可以用它来查询数据库
func GetOrmObject() orm.Ormer {
	return ormObject
}

users.go

package models

// Users - 用户表模型
type Users struct {
	UserId   int    `json:"user_id" orm:"auto"`
	Email    string `json:"email" orm:"size(128)"`
	Password string `json:"password" orm:"size(64)"`
	UserName string `json:"user_name" orm:"size(32)"`
}

main.go

package main

import (
	"net/http"

	"./models"
	"github.com/astaxie/beego/orm"
	"github.com/gin-gonic/gin"
)

var ORM orm.Ormer

func init() {
	models.ConnectToDb()
	ORM = models.GetOrmObject()
}

func main() {
	// 创建一个带有默认中间件的gin路由器:
	// logger和recovery(无崩溃)中间件
	router := gin.Default()

	router.POST("/createUser", createUser)
	router.GET("/readUsers", readUsers)
	router.PUT("/updateUser", updateUser)
	router.DELETE("/deleteUser", deleteUser)

	// 默认情况下,它在 :8080 上提供服务,除非
	// 定义了PORT环境变量。
	router.Run(":3000")
	// router.Run(":3000") 用于硬编码端口
}

func createUser(c *gin.Context) {
	var newUser models.Users
	c.BindJSON(&newUser)
	_, err := ORM.Insert(&newUser)
	if err == nil {
		c.JSON(http.StatusOK, gin.H{
			"status":    http.StatusOK,
			"email":     newUser.Email,
			"user_name": newUser.UserName,
			"user_id":   newUser.UserId})
	} else {
		c.JSON(http.StatusInternalServerError,
			gin.H{"status": http.StatusInternalServerError, "error": "创建用户失败"})
	}
}

func readUsers(c *gin.Context) {
	var user []models.Users
	_, err := ORM.QueryTable("users").All(&user)
	if err == nil {
		c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "users": &user})
	} else {
		c.JSON(http.StatusInternalServerError,
			gin.H{"status": http.StatusInternalServerError, "error": "读取用户失败"})
	}
}

func updateUser(c *gin.Context) {
	var updateUser models.Users
	c.BindJSON(&updateUser)
	_, err := ORM.QueryTable("users").Filter("email", updateUser.Email).Update(
		orm.Params{"user_name": updateUser.UserName,
			"password": updateUser.Password})
	if err == nil {
		c.JSON(http.StatusOK, gin.H{"status": http.StatusOK})
	} else {
		c.JSON(http.StatusInternalServerError,
			gin.H{"status": http.StatusInternalServerError, "error": "更新用户失败"})
	}
}

func deleteUser(c *gin.Context) {
	var delUser models.Users
	c.BindJSON(&delUser)
	_, err := ORM.QueryTable("users").Filter("email", delUser.Email).Delete()
	if err == nil {
		c.JSON(http.StatusOK, gin.H{"status": http.StatusOK})
	} else {
		c.JSON(http.StatusInternalServerError,
			gin.H{"status": http.StatusInternalServerError, "error": "删除用户失败"})
	}
}

有人能帮我解决这个问题吗?


更多关于Golang连接数据库失败问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang连接数据库失败问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


错误信息显示 lookup dbHost: no such host,表明数据库连接字符串中的主机名 dbHost 无法解析。这通常是因为 dbHost 没有被正确设置为有效的数据库主机地址。

在你的连接字符串中:

"user=postges password=postgres dbname=elixirapi_dev host=dbHost sslmode=disable"

host=dbHost 应该替换为实际的数据库主机地址。如果是本地数据库,通常使用 localhost127.0.0.1。如果是远程数据库,需要提供正确的主机名或IP地址。

另外,我注意到连接字符串中有一个拼写错误:user=postges 应该是 user=postgres

以下是修正后的 ConnectToDb 函数:

func ConnectToDb() {
    orm.RegisterDriver("postgres", orm.DRPostgres)
    
    // 修正连接字符串
    connectionString := "user=postgres password=postgres dbname=elixirapi_dev host=localhost port=5432 sslmode=disable"
    
    orm.RegisterDataBase("default", "postgres", connectionString)
    orm.RegisterModel(new(Users))
    
    // 添加数据库连接测试
    ormObject = orm.NewOrm()
    if err := ormObject.Using("default"); err != nil {
        panic(fmt.Sprintf("无法使用默认数据库: %v", err))
    }
    
    // 测试数据库连接
    if err := ormObject.Raw("SELECT 1").QueryRow(); err != nil {
        panic(fmt.Sprintf("数据库连接测试失败: %v", err))
    }
}

如果使用环境变量来配置数据库连接,可以这样修改:

func ConnectToDb() {
    orm.RegisterDriver("postgres", orm.DRPostgres)
    
    // 从环境变量获取配置
    dbUser := os.Getenv("DB_USER")
    dbPassword := os.Getenv("DB_PASSWORD")
    dbName := os.Getenv("DB_NAME")
    dbHost := os.Getenv("DB_HOST")
    dbPort := os.Getenv("DB_PORT")
    
    if dbHost == "" {
        dbHost = "localhost"
    }
    if dbPort == "" {
        dbPort = "5432"
    }
    
    connectionString := fmt.Sprintf(
        "user=%s password=%s dbname=%s host=%s port=%s sslmode=disable",
        dbUser, dbPassword, dbName, dbHost, dbPort,
    )
    
    orm.RegisterDataBase("default", "postgres", connectionString)
    orm.RegisterModel(new(Users))
    ormObject = orm.NewOrm()
}

确保你的PostgreSQL数据库正在运行,并且连接参数正确。可以使用以下命令测试数据库连接:

# 测试PostgreSQL连接
psql -h localhost -U postgres -d elixirapi_dev

如果数据库不在本地,请确保 dbHost 指向正确的服务器地址,并且网络连接正常。

回到顶部