You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gorm连接PostgreSQL时如何指定目标数据库而非默认库?

Go + Gorm 连接PostgreSQL时始终连接默认数据库的问题与解决

问题描述

使用Gorm连接PostgreSQL时,明明在DSN中指定了目标数据库my_database_name,但应用始终连接默认的postgres数据库。

连接数据库代码

func (app *Application) ConnectToPostgres() error {
    dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=UTC",
        app.Config.DB.Host,
        app.Config.DB.User,
        app.Config.DB.Password,
        app.Config.DB.DBName,
        app.Config.DB.Port,
    )

    // 尽管DSN指定了'my_database_name',但连接仍使用'postgres'
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        return err
    }

    app.DB = db
    return nil
}

配置信息

.env文件内容:

DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=
DB_NAME=my_database_name

已验证内容

  • 数据库my_database_name已存在
  • 连接字符串包含正确的数据库名称
  • 打印DSN显示格式正确
  • 可通过psql正常访问该数据库

额外环境信息

  • Go版本:1.23.3
  • Gorm版本:1.25.12
  • PostgreSQL版本:16.3
  • 操作系统:Arch Linux

主文件代码

package main

import (
    "flag"
    "log"
    "os"

    "github.com/gin-gonic/gin"
    "github.com/joho/godotenv"

    "github.com/lordaris/aris-erp/api"
)

func main() {
    r := gin.Default()

    // 从.env文件加载环境变量
    err := godotenv.Load(".env")
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    var cfg api.Config
    flag.StringVar(&cfg.DB.Host, "db-host", os.Getenv("DB_HOST"), "PostgreSQL host")
    flag.StringVar(&cfg.DB.Port, "db-port", os.Getenv("DB_PORT"), "PostgreSQL port")
    flag.StringVar(&cfg.DB.User, "db-user", os.Getenv("DB_USER"), "PostgreSQL user")
    flag.StringVar(&cfg.DB.Password, "db-password", os.Getenv("DB_PASSWORD"), "PostgreSQL password")
    flag.StringVar(&cfg.DB.DBName, "db-name", os.Getenv("DB_NAME"), "PostgreSQL database name")

    flag.Parse()

    app := api.NewApplication(cfg)

    // 连接PostgreSQL
    if err := app.ConnectToPostgres(); err != nil {
        log.Fatal("Could not connect to PostgreSQL: ", err)
    }

    // 路由设置
    api.Router(r, app)

    r.Run()
}

问题排查与解决

修改数据库连接用户名时触发错误,提示“以该用户名为名的数据库不存在”,由此定位到核心问题:连接字符串中密码为空值,导致参数解析移位,空密码被错误解析为数据库名称。

解决方法

  • 无密码场景:从连接字符串中完全移除password=相关占位符,修改后的DSN格式如下:
    dsn := fmt.Sprintf("host=%s user=%s dbname=%s port=%s sslmode=disable TimeZone=UTC",
        app.Config.DB.Host,
        app.Config.DB.User,
        app.Config.DB.DBName,
        app.Config.DB.Port,
    )
    
  • 有密码场景:为数据库用户设置实际密码,并在.env文件中填写DB_PASSWORD的有效值。

内容的提问来源于stack exchange,提问作者Aris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:12:03