亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 env 文件時 Golang 數據庫/sql 不連接

使用 env 文件時 Golang 數據庫/sql 不連接

Go
開滿天機 2023-02-21 13:20:08
這完美地工作并且數據庫已連接,沒有問題。但是我不想在函數中對我的值進行硬編碼,因此我使用的是 env 文件。但是使用 os.getenv 不會連接到數據庫。package mainimport (    "database/sql"    "fmt"    _ "github.com/lib/pq")const (    host     = "localhost"    port     = 5432    user     = "bond"    password = "password"    dbname   = "bookstore")func main() {    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+        "password=%s dbname=%s sslmode=disable",        host, port, user, password, dbname)    db, err := sql.Open("postgres", psqlInfo)    if err != nil {        panic(err)    }    defer db.Close()    err = db.Ping()    if err != nil {        panic(err)    }    fmt.Println("You connected to your database.")}以下代碼給出了錯誤 -panic: pq: password authentication failed for user "bond"var (    host     = "localhost"    port     = 5432    user     = "bond"    password = os.Getenv("DATABASE_PWD")    dbname   = "bookstore")為什么會這樣?
查看完整描述

2 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

看起來你正在做這樣的事情(游樂場):

var (

    env      = make(map[string]string) // Simulated environoment

    password = env["DATABASE_PWD"]

)


func init() {

    // Simulate loading .env file (godotenv.Load())

    env["DATABASE_PWD"] = "foo"

}


func main() {

    fmt.Println(password) // Outputs a blank line

    fmt.Println(env["DATABASE_PWD"]) // Outputs "foo"

}

這將不起作用,因為變量在init運行之前已初始化;這是按照規范

一個沒有導入的包是通過為它的所有包級變量分配初始值,然后按照它們在源代碼中出現的順序調用所有 init 函數來初始化的,可能在多個文件中,如呈現給編譯器。如果一個包有導入,導入的包在初始化包本身之前被初始化......

所以 的值是在運行password之前設置的(這意味著密碼將是您啟動應用程序時環境中的任何值 - 可能為空)。godotenv.Load()

您可以通過在運行后加載環境變量來解決此問題godotenv.Load()。我建議這樣做,main以便您可以處理任何錯誤(godotenv.Load()可能會失?。。?。請參閱包 repo 中的示例。

注意:這就是為什么包含一個最小的、可重現的示例很重要的原因。創建這樣的示例時,您可能會注意到它password是空的,并且問題與database/sql. 如果沒有比問題中提供的更多信息,則無法回答該問題。


查看完整回答
反對 回復 2023-02-21
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

為什么您的解決方案無法按預期工作

我想你誤解了 os.GetEnv() 函數的作用,你的操作系統有一些叫做環境變量的東西,這就是你想要達到的目的。

您的代碼返回一個空字符串,因為它未設置為環境變量。

您可以查看以下位置以了解有關此功能及其工作原理的更多信息:

你想做什么

現在請允許我解釋一下您想實際做什么,您想從文件中獲取這些變量,因此您需要:

  • 告訴程序它在哪里

  • 打開它

  • 解析它

  • 讀取值

您可以通過兩種方式做到這一點。

第一個解決方案(自己動手)

首先打開文件并將其內容傳遞給掃描儀。然后,您遍歷每一行并使用“=”字符(Env 格式)將該行分成兩部分,最后將其鍵/值存儲在地圖之類的東西中(或您想要/需要的任何東西)。

第二個解決方案(對于懶惰的開發或復雜的項目)

第二,如果你不想做所有這些,只需使用配置庫或解析器為你做。

這是使用 Viper 執行此操作的鏈接: Load config from file & environment variables in Golang with Viper


查看完整回答
反對 回復 2023-02-21
  • 2 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號