使用 pyodbc (推荐)
pyodbc 是一个功能强大且广泛支持的数据库连接库,它通过 ODBC (Open Database Connectivity) 驱动与数据库进行通信,这意味着你的系统需要先安装 ODBC 驱动。

安装 ODBC 驱动
这是使用 pyodbc 的前提条件。
-
Windows: 通常已经预装了,如果没有,可以从微软官网下载 OD Driver for SQL Server。
-
Linux: 可以使用
apt-get或yum安装。# 对于 Ubuntu/Debian sudo apt-get update sudo apt-get install unixodbc-dev odbcinst # 下载并安装 Microsoft ODBC Driver for SQL Server # 你可以找到 .deb 包并安装,或者按照微软官方文档进行操作
-
macOS: 可以使用 Homebrew 安装。
(图片来源网络,侵删)brew install unixodbc brew install microsoft/mssql-server/msodbcsql17
安装 pyodbc Python 库
使用 pip 安装:
pip install pyodbc
编写 Python 代码
pyodbc 的连接字符串格式比较固定,你需要提供服务器地址、数据库名、用户名和密码。
连接字符串格式:
DRIVER={ODBC Driver 17 for SQL Server};SERVER=server_name;DATABASE=db_name;UID=user;PWD=password
DRIVER: ODBC 驱动的名称,请确保你安装的驱动名称与此处一致(ODBC Driver 17 for SQL Server)。SERVER: SQL Server 实例的地址,可以是localhost、IP 地址或服务器名,如果使用默认实例,直接写地址;如果使用命名实例(如localhost\SQLEXPRESS),需要写全。DATABASE: 你要连接的数据库名。UID: 用户名。PWD: 密码。
完整示例代码:
import pyodbc
# --- 1. 创建连接 ---
# 请根据你的实际情况修改以下参数
server = 'your_server_name' # e.g., 'localhost' or '192.168.1.100'
database = 'your_database_name'
username = 'your_username'
password = 'your_password'
driver = '{ODBC Driver 17 for SQL Server}' # 确保驱动名称正确
# 构建 ODBC 连接字符串
connection_string = f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}'
try:
# 建立连接
conn = pyodbc.connect(connection_string)
print("连接成功!")
# --- 2. 创建游标 ---
# 游标用于执行 SQL 语句并获取结果
cursor = conn.cursor()
# --- 3. 执行 SQL 查询 ---
sql_query = "SELECT TOP 3 * FROM your_table_name;" # 替换成你的表名
cursor.execute(sql_query)
# --- 4. 获取并处理结果 ---
rows = cursor.fetchall()
print("查询结果:")
for row in rows:
print(row)
# --- 5. 插入数据示例 ---
insert_query = "INSERT INTO your_table_name (column1, column2) VALUES (?, ?);"
cursor.execute(insert_query, 'Value1', 123)
# 提交事务,使更改生效
conn.commit()
print("数据插入成功!")
except pyodbc.Error as e:
print(f"数据库连接或操作失败: {e}")
# 如果发生错误,回滚事务(对于插入/更新/删除操作)
if 'conn' in locals():
conn.rollback()
finally:
# --- 6. 关闭连接 ---
# 确保连接被关闭
if 'conn' in locals() and conn:
conn.close()
print("连接已关闭。")
使用 pymssql
pymssql 是一个纯 Python 实现的 SQL Server 客户端库,它不需要系统级的 ODBC 驱动,安装和配置相对简单。
安装 pymssql Python 库
使用 pip 安装:
pip install pymssql
编写 Python 代码
pymssql 的连接参数以函数参数的形式直接传入,非常直观。
完整示例代码:
import pymssql
# --- 1. 创建连接 ---
# 请根据你的实际情况修改以下参数
server = 'your_server_name' # e.g., 'localhost'
database = 'your_database_name'
username = 'your_username'
password = 'your_password'
try:
# 建立连接
conn = pymssql.connect(
server=server,
database=database,
user=username,
password=password
)
print("连接成功!")
# --- 2. 创建游标 ---
# with 语句可以自动处理游标的关闭
with conn.cursor(as_dict=True) as cursor:
# as_dict=True 可以让结果以字典形式返回,更易读
# --- 3. 执行 SQL 查询 ---
sql_query = "SELECT TOP 3 * FROM your_table_name;" # 替换成你的表名
cursor.execute(sql_query)
# --- 4. 获取并处理结果 ---
print("查询结果:")
for row in cursor:
print(row['column1'], row['column2']) # 通过列名访问数据
# --- 5. 插入数据示例 ---
insert_query = "INSERT INTO your_table_name (column1, column2) VALUES (%s, %s);"
# 注意:pymssql 使用 %s 作为占位符
cursor.execute(insert_query, 'ValueA', 456)
# 提交事务
conn.commit()
print("数据插入成功!")
except pymssql.Error as e:
print(f"数据库连接或操作失败: {e}")
# 如果发生错误,回滚事务
if 'conn' in locals():
conn.rollback()
finally:
# --- 6. 关闭连接 ---
# 确保连接被关闭
if 'conn' in locals() and conn:
conn.close()
print("连接已关闭。")
方法对比与选择
| 特性 | pyodbc |
pymssql |
|---|---|---|
| 依赖 | 需要系统级 ODBC 驱动 | 纯 Python,无需额外驱动 |
| 安装 | pip install pyodbc + 配置驱动 |
pip install pymssql |
| 连接字符串 | 使用 ODBC 格式的字符串 | 函数参数形式 |
| 性能 | 通常更快,底层是 C 实现 | 纯 Python,性能可能稍慢 |
| 功能 | 功能全面,支持所有 ODBC 特性 | 功能齐全,满足基本操作 |
| 推荐场景 | 生产环境、追求性能、已有 ODBC 驱动 | 开发环境、快速原型、避免系统配置 |
- 如果你在 Windows 上开发,或者对性能有较高要求,
pyodbc是一个非常成熟和强大的选择。 - 如果你追求简单、快速、不想配置系统驱动,
pymssql是一个非常好的选择。
最佳实践
- 使用
try...except...finally块:这是处理数据库连接和操作的黄金法则,它能确保即使在发生错误时,连接也能被正确关闭,避免资源泄漏。 - 使用上下文管理器 (
with语句):pymssql的游标支持with语句,可以自动处理游标的关闭。pyodbc的游标也可以通过类似方式实现。 - 使用参数化查询:永远不要用字符串拼接来构建 SQL 语句! 这会导致严重的 SQL 注入风险,两种库都支持参数化查询。
pyodbc: 使用 作为占位符。pymssql: 使用%s作为占位符。
- 及时提交或回滚:在执行
INSERT、UPDATE或DELETE操作后,必须调用conn.commit()来保存更改,如果发生错误,调用conn.rollback()来撤销未提交的操作。 - 连接池:在 Web 应用等高并发场景下,频繁地创建和销毁连接会严重影响性能,建议使用连接池技术,
pyodbc可以配合pyodbc.pooling,或者使用更高级的库如SQLAlchemy。
常见问题 (FAQ)
Q1: pyodbc.OperationalError: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")
A1: 这表示 pyodbc 找不到你指定的 ODBC 驱动,请确保:
- 你已经正确安装了 ODBC 驱动。
- 连接字符串中的
DRIVER名称与系统中注册的驱动名称完全一致,你可以在系统 ODBC 数据源管理器中查看已安装的驱动名称。
Q2: pymssql.OperationalError: (20009, b'DB-Lib error message 20009, severity 9:\nAdaptive Server connection failed')
A2: 这通常意味着无法连接到 SQL Server 服务器,请检查:
- 服务器地址 (
server) 是否正确。 - SQL Server 服务是否正在运行。
- 防火墙是否阻止了端口(默认是 1433)。
- 用户名和密码是否正确。
Q3: 如何处理 Windows 身份验证? A3: 对于 Windows 身份验证,你不需要提供用户名和密码。
pyodbc: 连接字符串中省略UID和PWD,并使用Trusted_Connection=yes。connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=your_server;DATABASE=your_db;Trusted_Connection=yes;"pymssql:pymssql对 Windows 身份验证的支持不如pyodbc原生,你可能需要使用pymssql.connect(server=..., database=..., trusted=True),但这依赖于特定的配置,对于 Windows 身份验证,pyodbc是更简单、更可靠的选择。
