$ ls crystal_folder

Psycopg2 Raise OperationalError的另類思路

故事是這樣的,我開心寫了一支Python程式,要放到法國免費主機排程執行, 結果總是收到OperationalError這個錯誤, 因為另個環境(Replit)可以執行(不過這環境是吃環境變數,跟這故事有關,後面會說),

所以我本來以為是主機地區影響(謎之音:太牽強了吧),但沒有root權限也不能改, 想說不要花太多時間處理乾脆架在家裡Windows上執行吧

但我今天週末有空在自己Windows電腦上跑同支程式,竟然噴一樣的錯誤

完整的error訊息是:

OperationalError: server didn't return client encoding

所以我總是往set encoding的方向找,我試過在dns(像是postgres://這樣的路徑)帶encoding UTF8的參數,也是過對宣告出來的connection設置編碼-全都沒用


到後來我開始懷疑是不是套件安裝步驟完整度有問題,例如電腦上有沒有甚麼少裝的軟體,所以才異常(畢竟有些套件會要求電腦上要先安裝某些軟體才能用;而且當時瞎猜Replit內建支援PostgreSQL)

開始對可以執行環境跟不能執行環境的套件版本...但竟然一樣欸🫠

補充:中間還發生Windows移除psycopg2保留psycopg2-binary然後程式說找不到模組psycopg2,最後uninstall psycopg2-binary重新pip install又讀到的問題🫠🫠🫠

又想起來因為一兩年前才在電腦上跑過使用這個套件的程式,所以想說會不會是版本問題,但仔細想想我也沒改過套件版本啊🫠

而且如果真的是軟體懸缺問題那一兩年前怎麼能跑?然後免費主機又不能用root怎麼辦—真的是超級瞎猜


平常上班挺累回到家debug就很隨興,通常都是睡前一小時,然後今天週六用了一個下午,到吃晚餐前一刻都還是上方的經歷,頭上很多問號

吃完晚餐後我開始想到,有時候會不會跟環境或套件吃不吃ipv6有關呢(但這也是瞎猜,Replit就可以用ipv6連到啊==)

所以我開始改psycopg2.connect()內的參數-奇蹟就是這時候發生的,我注意到database=後面寫錯啦,然後我把多餘的字砍掉...就連到了
就連到了
就連到了
就連到了

啊啊啊啊啊啊啊
至於Replit能執行,指是因為這段是用環境變數,環境變數裡database的名稱是正確的...
...
有點傷心
不過明明是Database不存在幹嘛吐編碼錯誤的訊息rr,難倒是資安考量......

#Python