如何用 python 來連接使用資料庫 (MS SQL)

1/28/2022 PythonMSSQL

若要用 Pyhton 存取資料庫的話,幾乎都會用到 pyodbc 這個套件來操作 & 訪問資料庫

在使用套件前須先安裝 pyodbc,語法如下:

pip install pyodbc

安裝完後,即可用下面這行幫助我們與資料庫建立連線:

import pyodbc
conn = pyodbc.connect('DRIVER={SQL Server}; SERVER=%s; DATABASE=%s; UID=%s; PWD=%s; Trusted_Connection=no;' %(server, db, uid, pwd))
1
2

其中,DRIVER 有多種,如:SQL Server,SQL Server Native Client 11.0,ODBC Driver 17 for SQL Server 等等

而要怎麼確認我們的 ODBC Driver 呢?

# 確認 ODBC Driver

  1. 在 Command Prompt 中輸入 odbcad32,即可叫出 ODBC Data Source Administrator 視窗
  2. 再切換到 Drivers 的分頁後,即可得知這台電腦上的 ODBC 版本

ODBC Data Source Administrator

而可用的 Drivers 如下:來源 (opens new window)

  • {SQL Server} - released with SQL Server 2000
  • {SQL Native Client} - released with SQL Server 2005 (also known as version 9.0)
  • {SQL Server Native Client 10.0} - released with SQL Server 2008
  • {SQL Server Native Client 11.0} - released with SQL Server 2012
  • {ODBC Driver 11 for SQL Server} - supports SQL Server 2005 through 2014
  • {ODBC Driver 13 for SQL Server} - supports SQL Server 2005 through 2016
  • {ODBC Driver 13.1 for SQL Server} - supports SQL Server 2008 through 2016
  • {ODBC Driver 17 for SQL Server} - supports SQL Server 2008 through 2019

若 Driver 不支援的話,在程式執行時,會跳出下面的錯誤訊息:
pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNt][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (SECCreateCredentials()). (1)')

若使用的 MS Server 版本較新的話,可將 Driver 直接設為: ODBC Driver 17 for SQL Server

# pyodbc.connect 參數

在確認了 Driver 後,剩下的參數 Server, Database, UID, PWD,則分別為:

  • Server:要連接的資料庫 IP
  • Database:資料庫中的 DB 名稱
  • UID:登入資料庫的帳號
  • PWD:登入資料庫的密碼

# pyodbc 操作資料庫

連接到資料庫後,只要在設定好操作資料庫的語法即可,若要查詢 table ,以及用 pandas 的 dataframe 印出的話,如下:

script = """
SELECT * FROM [dbo].[XXXX] 
WHERE XXXX
"""

df = pd.read_sql(script, conn)
1
2
3
4
5
6

若要將資料庫的資料匯入可參考這篇:
如何用 Python 將 CSV 檔案匯入資料庫(MSSQL) (opens new window)

匯出的話,為:
利用 Python 直接匯出資料庫 (MSSQL) 的資料 (Pandas ReadSQL) (opens new window)

Last Updated: 6/30/2023, 2:59:11 PM

歡迎點擊追蹤:

(adsbygoogle = window.adsbygoogle || []).push({});