🔧修掉 Python 「假警告」與資料庫連線雷:給完全不懂也能跟上的工程師筆記
為什麼你會看到一堆紅字,卻其實不是錯誤?
很多人在 Windows 上跑 Python 連資料庫(例如 SQL Server)時,螢幕上常出現兩種訊息:
-
SyntaxWarning: invalid escape sequence '\d' -
RemovedIn20Warning: Deprecated API features detected!(SQLAlchemy 2.0 相關)
先別慌!這兩個多半不是「炸掉的錯誤」,而是提醒你有更好的寫法。下面用超白話把它們一次講清楚,附上安全做法與完整步驟。文內所有範例都重新編寫(避免任何隱私資訊),你可以放心複製改造。
Part A:為什麼會有
SyntaxWarning: invalid escape sequence '\d'
發生原因(一句話)
你在一般字串寫了正規表示式,像
"(\d+)"。Python 看到
\d 以為是跳脫字元(例如
\n),結果「不認識」,就發出
SyntaxWarning。
正確解法(兩種,擇一)
✅ 推薦:原始字串(在字串前加
r)
或,用雙反斜線
什麼時候別用原始字串?
幾乎都能用;只有當字串最後一個字元是單一的
\ 時不行(很少見)。
Part B:為什麼會有
RemovedIn20Warning(SQLAlchemy
2.0)
發生原因(一句話)
你用的是 SQLAlchemy 1.4,但寫法是 1.x 的舊 API(例如
engine.execute("..."))。1.4
還能運作,但提醒你:升 2.0 後會不相容。
你有兩條路
路線 1:先把版本鎖在 1.4,不改程式碼
在 requirements.txt 放:
路線 2:把程式改成 2.0 風格(未來免煩惱)
把舊式
engine.execute(...)
改成下面這樣(1.4 也支援):
你用哪種資料庫就換對應函式:- SQL Server:
SELECT SYSDATETIME()/SELECT GETDATE() - Oracle:
SELECT SYSTIMESTAMP FROM DUAL - PostgreSQL:
SELECT NOW() - MySQL/MariaDB:
SELECT NOW()
Part C:Windows 怎麼確認 ODBC 驅動是不是有裝好?
很多 Python 連 SQL Server 的專案走
pyodbc,但前提是你要有對應的 ODBC Driver。
檢查方式(四選一)
方法 1:PowerShell
方法 2:Python 直接問 pyodbc
方法 3:登錄機碼(CMD)
方法 4:ODBC 圖形介面
-
64 位元:執行
C:\Windows\System32\odbcad32.exe -
32 位元:執行
C:\Windows\SysWOW64\odbcad32.exe
切到 Drivers 分頁找「ODBC Driver 17/18 for SQL Server」。
Part D:最短測通腳本(pyodbc 直連 SQL Server)
把
<...>
換成你的實際值,檔案名假設為
quick_check.py:
執行成功會印:pyodbc ok: (1,)。
若 Timeout 或登入失敗,就先排查網路/帳密/權限/防火牆。
Part E:SQLAlchemy(1.4/2.0 皆通)的穩定連線範例
Part F:看到「資料處理完成但全部 Fail」怎麼辦?
有些資料流程(例如測試檔解析)會顯示「處理完成,但 N 筆都被判定 Fail」。
這不一定是你的程式壞掉,而可能是:
-
上游就標記為失敗(檔案內的結果旗標或 bin)
-
你的自訂規則太嚴(例如缺乏上下限就判 Fail)
-
單位換算有誤(mV 當 V)
-
邊界值浮點誤差
建議:
把「上游結果」與「自訂規則」兩套判定分開列印/彙總,先以上游結果為主產出報表,讓自訂規則只做「警示」。
Part G:常用懶人指令(不想開編輯器,直接一鍵修)
以下是一般化示例,請視你的實際檔名調整;保證與本文無關的私密內容。
1) 批次修正
\d
正規表達式警告(PowerShell)
2) 批次把
engine.execute(...) 改為 2.0
風格
改完後請確保檔案有
from sqlalchemy import text,以及外層用
Part H:FAQ
Q1:我已鎖 SQLAlchemy <2.0,為什麼還有警告?
A:因為你仍用舊 API(engine.execute)。改成 2.0 風格就不會跳。
Q2:我不想改程式碼,只想安靜
A:可以暫時靜音(不建議長期):
Q3:ODBC Driver 要 17 還是 18?
A:兩者都行,與你的作業系統與 Python 位元數一致即可。某些伺服器策略會要求加密;上例已加
Encrypt=yes;TrustServerCertificate=yes
方便內網測試。
Q4:SyntaxWarning
不修會怎樣?
A:多半不影響執行,但長期容易埋 bug。用原始字串 r"..."
是最穩的寫法。
結語:把「警告」當成升級的路標
-
Regex:一律
r"...",省心又直覺。 -
SQLAlchemy:現在就用 2.0 風格(雖然你還在 1.4),未來升級零痛苦。
-
pyodbc + ODBC:先檢查驅動,再測一個最小指令,縮短排錯時間。
留言
張貼留言