🔧修掉 Python 「假警告」與資料庫連線雷:給完全不懂也能跟上的工程師筆記

為什麼你會看到一堆紅字,卻其實不是錯誤?

很多人在 Windows 上跑 Python 連資料庫(例如 SQL Server)時,螢幕上常出現兩種訊息:

  1. SyntaxWarning: invalid escape sequence '\d'

  2. RemovedIn20Warning: Deprecated API features detected!(SQLAlchemy 2.0 相關)

先別慌!這兩個多半不是「炸掉的錯誤」,而是提醒你有更好的寫法。下面用超白話把它們一次講清楚,附上安全做法與完整步驟。文內所有範例都重新編寫(避免任何隱私資訊),你可以放心複製改造。


Part A:為什麼會有 SyntaxWarning: invalid escape sequence '\d'

發生原因(一句話)

你在一般字串寫了正規表示式,像 "(\d+)"。Python 看到 \d 以為是跳脫字元(例如 \n),結果「不認識」,就發出 SyntaxWarning

正確解法(兩種,擇一)

✅ 推薦:原始字串(在字串前加 r

# 壞例子(會出現 SyntaxWarning): pattern = re.compile("user:(\d+)$") # 好例子(原始字串): pattern = re.compile(r"user:(\d+)$")

或,用雙反斜線

pattern = re.compile("user:(\\d+)$")
什麼時候別用原始字串?

幾乎都能用;只有當字串最後一個字元是單一的 \ 時不行(很少見)。



Part B:為什麼會有 RemovedIn20Warning(SQLAlchemy 2.0)

發生原因(一句話)

你用的是 SQLAlchemy 1.4,但寫法是 1.x 的舊 API(例如 engine.execute("..."))。1.4 還能運作,但提醒你:升 2.0 後會不相容

你有兩條路

路線 1:先把版本鎖在 1.4,不改程式碼

pip install "SQLAlchemy<2.0"

requirements.txt 放:

SQLAlchemy<2.0

路線 2:把程式改成 2.0 風格(未來免煩惱)
把舊式 engine.execute(...) 改成下面這樣(1.4 也支援):

# 舊式(不建議) # for row in engine.execute("SELECT GETDATE()"): # print(row) # 新式(2.0 風格) from sqlalchemy import text with engine.connect() as conn: result = conn.execute(text("SELECT GETDATE()")) for row in result: print(row)
你用哪種資料庫就換對應函式:
  • 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

Get-OdbcDriver -Name "*SQL Server*"

方法 2:Python 直接問 pyodbc

python -c "import pyodbc; print(pyodbc.drivers())"

方法 3:登錄機碼(CMD)

reg query "HKLM\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers" reg query "HKLM\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\ODBC Drivers"

方法 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

import pyodbc driver = "ODBC Driver 17 for SQL Server" # 或 18,依你電腦安裝而定 server = "192.0.2.10,1433" # 範例 IP(請換成你的);逗號表示 port database = "<DB_NAME>" user = "<USER>" password = "<PASSWORD>" cn = pyodbc.connect( f"DRIVER={{{driver}}};SERVER={server};DATABASE={database};UID={user};PWD={password};" "Encrypt=yes;TrustServerCertificate=yes", timeout=5 ) cur = cn.cursor() cur.execute("SELECT 1") print("pyodbc ok:", cur.fetchone()) cn.close()

執行成功會印:pyodbc ok: (1,)
若 Timeout 或登入失敗,就先排查網路/帳密/權限/防火牆。


Part E:SQLAlchemy(1.4/2.0 皆通)的穩定連線範例

from sqlalchemy import create_engine, text driver = "ODBC Driver 17 for SQL Server" # 或 18 host = "192.0.2.10" port = 1433 db = "<DB_NAME>" user = "<USER>" pwd = "<PASSWORD>" engine = create_engine( f"mssql+pyodbc://{user}:{pwd}@{host}:{port}/{db}" f"?driver={driver.replace(' ', '+')}" f"&Encrypt=yes&TrustServerCertificate=yes", future=True, # 先採用 2.0 行為,未來升級更平滑 pool_pre_ping=True # 連線池心跳,避免連線閒置失效 ) with engine.connect() as conn: print(conn.execute(text("SELECT SYSDATETIME()")).fetchone())

Part F:看到「資料處理完成但全部 Fail」怎麼辦?

有些資料流程(例如測試檔解析)會顯示「處理完成,但 N 筆都被判定 Fail」。
不一定是你的程式壞掉,而可能是:

  • 上游就標記為失敗(檔案內的結果旗標或 bin)

  • 你的自訂規則太嚴(例如缺乏上下限就判 Fail)

  • 單位換算有誤(mV 當 V)

  • 邊界值浮點誤差

建議
把「上游結果」與「自訂規則」兩套判定分開列印/彙總,先以上游結果為主產出報表,讓自訂規則只做「警示」。


Part G:常用懶人指令(不想開編輯器,直接一鍵修)

以下是一般化示例,請視你的實際檔名調整;保證與本文無關的私密內容


1) 批次修正 \d 正規表達式警告(PowerShell)

(Get-Content .\your_script.py) ` -replace "re\.compile\('id:\(\\d\+\)'\)", "re.compile(r'id:(\d+)')" | Set-Content .\your_script.py

2) 批次把 engine.execute(...) 改為 2.0 風格

(Get-Content .\your_script.py) ` -replace 'engine\.execute\("([^"]+)"\)', 'conn.execute(text("$1"))' | Set-Content .\your_script.py
改完後請確保檔案有 from sqlalchemy import text,以及外層用
with engine.connect() as conn: ...

Part H:FAQ

Q1:我已鎖 SQLAlchemy <2.0,為什麼還有警告?
A:因為你仍用舊 API(engine.execute)。改成 2.0 風格就不會跳。

Q2:我不想改程式碼,只想安靜
A:可以暫時靜音(不建議長期):

set SQLALCHEMY_SILENCE_UBER_WARNING=1

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:先檢查驅動,再測一個最小指令,縮短排錯時間。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題