友情提示:window server上很容易就踩坑
1. 背景
- 語(yǔ)言:golang
- ORM: gorm
- 運(yùn)行環(huán)境: Windows server
1. 起因
因?yàn)橥庠谝蛩匦亲Γ坏貌辉赪indows server上跑程序殊霞,然后就直接在在初始化DB連接時(shí)失敗了,返回的error是the system cannot find the path specified侧甫。這里其實(shí)是有點(diǎn)奇怪的,這提示似乎指的是本地文件路徑問(wèn)題蹋宦,但DB配置是已經(jīng)讀取成功的披粟,連接也是連接遠(yuǎn)端DB,并沒(méi)有讀取本地文件操作冷冗?
2. 查
- 順著鏈路往下查守屉,在gorm.open報(bào)錯(cuò),查到是parseDsn失敗蒿辙,但同樣的程序和dsn在本地電腦運(yùn)行并沒(méi)有問(wèn)題拇泛。
- 繼續(xù)往下,看到parseDsn里的parseDSNParams里其中有個(gè)地方調(diào)用time.LoadLocation函數(shù)思灌。
- 知道了俺叭。LoadLocation 有個(gè)問(wèn)題,它依賴于 IANA Time Zone Database 這個(gè)數(shù)據(jù)庫(kù)泰偿,一般linux系統(tǒng)都帶了熄守,但是windows系統(tǒng)就沒(méi)帶。沒(méi)有 tzdata 就會(huì)從$GOROOT/中找耗跛。但很明顯裕照,Windows server并沒(méi)有裝golang,所以肯定會(huì)找不到指定路徑调塌,因此會(huì)提示這個(gè)看似搭不上邊的錯(cuò)誤晋南。(Linux就不用管)
3.解決
把tzdata文件放到程序目錄,我直接指定ZONEINFO環(huán)境變量就行了羔砾,os.Setenv("ZONEINFO", '.\zoneinfo.zip')
搬俊。 另外Windows我一般都用filepath.Join去處理一遍路徑,免得斜杠反斜杠煩惱蜒茄。