pyodbc: 这是一个通用的数据库连接库,支持 ODBC (Open Database Connectivity) 标准,它功能强大、性能优秀,是许多生产环境的首选。pymssql: 这是一个纯 Python 实现的 SQL Server 驱动库,它的优点是安装简单(不需要配置 ODBC),轻量级,非常适合快速开发和部署。
下面我将详细介绍这两种方法,并提供完整的代码示例。

准备工作:安装驱动
无论使用哪种库,你都需要确保你的系统上安装了正确的 SQL Server ODBC 驱动。
Windows:
- 访问 Microsoft 官方下载页面:ODBC Driver for SQL Server
- 下载并安装最新版本的 "OD Driver 18 for SQL Server",安装过程非常简单,一路点击 "下一步" 即可。
Linux (以 Ubuntu 为例):
# 1. 下载 Microsoft 仓库的 GPG 密钥 curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # 2. 添加仓库 sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list)" # 3. 更新包列表并安装驱动 sudo apt-get update sudo apt-get install mssql-tools unixodbc-dev
macOS (使用 Homebrew):

# 1. 添加 Microsoft 的 tap brew tap microsoft/mssql-release # 2. 运行脚本以接受许可条款并安装驱动 brew install msodbcsql17 mssql-tools
使用 pyodbc (推荐)
pyodbc 是功能最全、社区最活跃的库,推荐在生产环境中使用。
安装 pyodbc
pip install pyodbc
连接字符串
连接字符串是关键,格式通常为:
DRIVER={...};SERVER=...;DATABASE=...;UID=...;PWD=...
DRIVER: 指定你安装的 ODBC 驱动名,对于新版的 Driver 18,通常是ODBC Driver 18 for SQL Server。SERVER: 你的 SQL Server 地址,可以是服务器名、IP 地址或localhost。DATABASE: 你要连接的数据库名。UID: 用户名。PWD: 密码。
注意: 如果你的 SQL Server 配置为 Windows 身份验证,则不需要 UID 和 PWD,而是需要 Trusted_Connection=yes。
完整代码示例
import pyodbc
import pandas as pd # 可选,用于将结果转为DataFrame
# --- 1. 定义连接字符串 ---
# 使用 SQL Server 身份验证
# connection_string = "DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;DATABASE=YourDatabase;UID=your_username;PWD=your_password;TrustServerCertificate=yes"
# 使用 Windows 身份验证 (更推荐在企业环境中使用)
# TrustServerCertificate=yes 用于跳过 SSL 证书验证,在本地开发时很方便
connection_string = "DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes;TrustServerCertificate=yes"
# --- 2. 建立连接 ---
try:
conn = pyodbc.connect(connection_string)
print("连接成功!")
# 使用 'with' 语句可以确保游标和连接在使用后被正确关闭
with conn:
cursor = conn.cursor()
# --- 3. 执行 SQL 查询 ---
print("\n--- 执行查询 ---")
sql_query = "SELECT TOP 3 name, database_id FROM sys.databases;"
cursor.execute(sql_query)
# --- 4. 获取并处理结果 ---
print("\n--- 查询结果 ---")
rows = cursor.fetchall()
for row in rows:
print(f"数据库: {row.name}, ID: {row.database_id}")
# --- 5. 执行参数化查询 (防止 SQL 注入) ---
print("\n--- 执行参数化查询 ---")
# 使用 ? 作为占位符
param_query = "SELECT * FROM YourTable WHERE YourColumn = ?;"
param_value = 'some_value'
cursor.execute(param_query, param_value)
# 将结果直接读取到 Pandas DataFrame (非常方便)
df = pd.read_sql(param_query, conn, params=[param_value])
print("\nPandas DataFrame 结果:")
print(df)
# --- 6. 执行插入操作 ---
print("\n--- 执行插入操作 ---")
insert_query = "INSERT INTO YourTable (Column1, Column2) VALUES (?, ?);"
data_to_insert = ('Value A', 123)
cursor.execute(insert_query, data_to_insert)
# 提交事务!对于增删改操作,必须调用 commit() 才能生效
conn.commit()
print("插入成功!")
except pyodbc.Error as e:
print(f"数据库操作失败: {e}")
# 如果发生错误,可以回滚事务
# if conn:
# conn.rollback()
finally:
# --- 7. 关闭连接 ---
if 'conn' in locals() and conn:
conn.close()
print("\n连接已关闭。")
使用 pymssql
pymssql 更轻量级,安装和配置都更简单,适合不希望处理 ODBC 驱动配置的场景。
安装 pymssql
pip install pymssql
连接字符串
pymssql 的连接方式更直接,直接作为参数传递给 connect 函数。
完整代码示例
import pymssql
import pandas as pd # 可选
# --- 1. 定义连接参数 ---
server = 'localhost'
user = 'your_username'
password = 'your_password'
database = 'YourDatabase'
# --- 2. 建立连接 ---
conn = None
try:
conn = pymssql.connect(server=server, user=user, password=password, database=database)
print("连接成功!")
# 使用 'with' 语句可以确保游标和连接在使用后被正确关闭
with conn.cursor(as_dict=True) as cursor: # as_dict=True 让结果以字典形式返回,更易读
# --- 3. 执行 SQL 查询 ---
print("\n--- 执行查询 ---")
sql_query = "SELECT TOP 3 name, database_id FROM sys.databases;"
cursor.execute(sql_query)
# --- 4. 获取并处理结果 ---
print("\n--- 查询结果 ---")
rows = cursor.fetchall()
for row in rows:
print(f"数据库: {row['name']}, ID: {row['database_id']}")
# --- 5. 执行参数化查询 ---
print("\n--- 执行参数化查询 ---")
# 使用 %s 作为占位符
param_query = "SELECT * FROM YourTable WHERE YourColumn = %s;"
param_value = 'some_value'
cursor.execute(param_query, param_value)
# 读取到 Pandas DataFrame
df = pd.read_sql(param_query, conn, params=(param_value,))
print("\nPandas DataFrame 结果:")
print(df)
# --- 6. 执行插入操作 ---
print("\n--- 执行插入操作 ---")
insert_query = "INSERT INTO YourTable (Column1, Column2) VALUES (%s, %s);"
data_to_insert = ('Value B', 456)
cursor.execute(insert_query, data_to_insert)
# 提交事务
conn.commit()
print("插入成功!")
except pymssql.Error as e:
print(f"数据库操作失败: {e}")
# 如果发生错误,可以回滚事务
# if conn:
# conn.rollback()
finally:
# --- 7. 关闭连接 ---
if conn:
conn.close()
print("\n连接已关闭。")
pyodbc vs pymssql 对比
| 特性 | pyodbc |
pymssql |
|---|---|---|
| 依赖 | 需要 ODBC 驱动 (ODBC Driver 18) | 纯 Python,无外部依赖 |
| 安装 | pip install pyodbc + 安装 ODBC 驱动 |
pip install pymssql |
| 性能 | 通常更高,底层是 C 实现 | 纯 Python,性能稍低 |
| 功能 | 非常全面,支持所有 ODBC 特性 | 功能齐全,但可能缺少一些高级 ODBC 特性 |
| 连接方式 | 通过连接字符串 | 通过关键字参数 |
| 参数化查询 | 使用 占位符 | 使用 %s 占位符 |
| 结果游标 | 返回元组列表 | 默认返回元组列表,可设为 as_dict=True 返回字典 |
| 适用场景 | 生产环境、高性能要求、复杂操作 | 快速开发、简单任务、环境配置困难的场景 |
- 首选
pyodbc: 除非你有非常明确的理由(例如无法安装 ODBC 驱动),否则pyodbc是更稳定、功能更强大的选择。 - 始终使用参数化查询: 永远不要用 Python 字符串拼接来构建 SQL 语句,这极易导致 SQL 注入攻击,始终使用 (
pyodbc) 或%s(pymssql) 作为占位符。 - 使用
with语句: 它能自动管理游标和连接的生命周期,即使发生异常也能确保资源被正确释放。 - 记得
commit(): 在执行INSERT,UPDATE,DELETE操作后,必须调用conn.commit()来提交事务,否则更改不会持久化到数据库。 - 处理异常: 将数据库操作放在
try...except块中,以捕获并处理可能发生的错误(如连接失败、SQL 语法错误等)。 - 结合 Pandas: 如果需要进行数据分析,使用
pd.read_sql()可以非常方便地将查询结果直接加载到 DataFrame 中。
