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.go 和 models/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
更多关于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 应该替换为实际的数据库主机地址。如果是本地数据库,通常使用 localhost 或 127.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 指向正确的服务器地址,并且网络连接正常。

