核心概念
在 Python 中操作 SQL Server,我们主要使用两个库:

pyodbc: 这是一个非常流行的、功能强大的数据库连接库,它提供了一个标准的 Python DB-API 2.0 接口,可以连接到各种数据库,包括 SQL Server,它使用微软官方的 ODBC 驱动程序。pymssql: 这是一个更轻量级的库,专门为 SQL Server 设计,它不使用 ODBC 层,而是直接通过套接字与数据库通信,因此安装和配置通常更简单,性能在某些场景下可能更好。
推荐选择:
- 如果您需要连接到不同类型的数据库(MySQL, PostgreSQL, Oracle 等),或者需要使用 ODBC 的特定高级功能,推荐使用
pyodbc。 - 如果您的项目只连接 SQL Server,并且希望安装过程尽可能简单直接,推荐使用
pymssql。
在本指南中,我将主要介绍 pyodbc,因为它更通用,并提供两种安装方式的说明。
第一步:环境准备
在编写 Python 代码之前,您需要确保您的系统已经准备好连接 SQL Server 所需的驱动程序。
方案 A: 使用 pyodbc (推荐)
pyodbc 依赖于一个 ODBC 驱动程序,您需要安装微软官方的 ODBC Driver for SQL Server。

-
安装 Python 库: 打开您的终端或命令提示符,运行以下命令:
pip install pyodbc
-
安装 ODBC 驱动程序: 这是最关键的一步,您需要从微软官网下载并安装与您的 Python 架构(32位或64位)相匹配的驱动程序。
- 推荐安装最新版本的 ODBC Driver 18 for SQL Server。
- 下载地址:Microsoft ODBC Driver 18 for SQL Server
- 在安装过程中,确保勾选了 "Microsoft ODBC Driver 18 for SQL Server" 选项。
注意: 您的 Python 解释器(无论是从 python.org 下载的还是 Anaconda)的位数(32/64)必须与您安装的 ODBC 驱动程序的位数一致,绝大多数现代系统都是 64 位的。
方案 B: 使用 pymssql
pymssql 的配置要简单得多,因为它不依赖 ODBC。

-
安装 Python 库: 打开您的终端或命令提示符,运行以下命令:
pip install pymssql
完成! 这样就安装好了。
pymssql会自己处理底层的网络通信。
第二步:连接到 SQL Server 数据库
无论您选择哪个库,连接数据库都需要几个基本信息:
- 服务器名称: SQL Server 实例的地址。
localhost(SQL Server 安装在本地)- (本地服务器的简写)
168.1.100(服务器的 IP 地址)SERVER_NAME\INSTANCE_NAME(命名实例)
- 数据库名称: 您要连接的数据库,
master,mydb等。 - 用户名和密码: 用于身份验证的凭据。
- 信任连接: 如果您的 SQL Server 配置为 Windows 身份验证,您可以使用信任连接,而无需提供用户名和密码。
pyodbc 连接示例
pyodbc 的连接字符串比较灵活,下面是几种常见的连接方式。
import pyodbc
# --- 连接信息 ---
# 请根据您的实际情况修改这些值
server = 'localhost' # 或者您的服务器地址
database = 'master' # 您要连接的数据库名
username = 'your_username' # 如果使用 SQL Server 身份验证
password = 'your_password' # 如果使用 SQL Server 身份验证
trusted_connection = 'yes' # 如果使用 Windows 身份验证
# --- 构建 pyodbc 连接字符串 ---
# 方式 1: 使用 SQL Server 身份验证
# 注意: 驱动名称可能因版本而异,'ODBC Driver 18 for SQL Server' 是较新的
# 如果不行,可以尝试 'ODBC Driver 17 for SQL Server' 或 'SQL Server'
conn_str_sql_auth = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}'
# 方式 2: 使用 Windows 身份验证 (推荐在开发环境中使用)
conn_str_win_auth = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};DATABASE={database};Trusted_Connection={trusted_connection}'
# --- 尝试连接 ---
try:
# 选择一种连接字符串
connection = pyodbc.connect(conn_str_win_auth)
print("连接成功!")
# 在这里执行数据库操作...
# (代码将在下一部分展示)
except pyodbc.Error as e:
print(f"连接失败: {e}")
finally:
if 'connection' in locals() and connection:
connection.close()
print("连接已关闭。")
pymssql 连接示例
pymssql 的连接方式非常直接。
import pymssql
# --- 连接信息 ---
server = 'localhost'
database = 'master'
username = 'your_username'
password = 'your_password'
try:
# --- 尝试连接 ---
connection = pymssql.connect(
server=server,
database=database,
user=username,
password=password
)
print("连接成功!")
# 在这里执行数据库操作...
# (代码将在下一部分展示)
except pymssql.Error as e:
print(f"连接失败: {e}")
finally:
if 'connection' in locals() and connection:
connection.close()
print("连接已关闭。")
第三步:执行 SQL 语句
连接成功后,您可以执行各种 SQL 语句:查询数据、插入、更新、删除等。
执行查询并获取数据
最佳实践是使用 参数化查询 来防止 SQL 注入攻击。
# 假设 'connection' 对象已经成功创建
try:
# 创建一个游标对象
cursor = connection.cursor()
# --- 查询示例 ---
# 使用参数化查询
sql_query = "SELECT * FROM Employees WHERE Department = %s AND Salary > %s"
department = 'IT'
min_salary = 80000
# 执行查询
cursor.execute(sql_query, (department, min_salary))
# 获取所有查询结果
rows = cursor.fetchall()
print(f"在 {department} 部门找到 {len(rows)} 名员工薪资高于 {min_salary}:")
for row in rows:
# row 是一个元组,可以通过索引访问列
print(f"ID: {row[0]}, 姓名: {row[1]}, 薪资: {row[2]}")
# 获取单行结果
# cursor.fetchone()
# 获取剩余的所有行
# cursor.fetchmany(size)
except Exception as e:
print(f"查询出错: {e}")
finally:
if 'cursor' in locals():
cursor.close()
执行非查询语句 (INSERT, UPDATE, DELETE)
对于修改数据的操作,您需要提交事务才能使更改永久生效。
# 假设 'connection' 对象已经成功创建
try:
cursor = connection.cursor()
# --- 插入示例 ---
insert_sql = "INSERT INTO Employees (Name, Department, Salary) VALUES (%s, %s, %s)"
new_employee = ('张三', '销售', 75000)
cursor.execute(insert_sql, new_employee)
# --- 更新示例 ---
# update_sql = "UPDATE Employees SET Salary = %s WHERE Name = %s"
# new_salary = 85000
# employee_name = '李四'
# cursor.execute(update_sql, (new_salary, employee_name))
# --- 删除示例 ---
# delete_sql = "DELETE FROM Employees WHERE Name = %s"
# employee_to_delete = '王五'
# cursor.execute(delete_sql, (employee_to_delete,))
# 提交事务,使更改生效
connection.commit()
print(f"成功插入/更新/删除了 {cursor.rowcount} 行数据。")
except Exception as e:
# 如果发生错误,回滚事务
connection.rollback()
print(f"操作失败,已回滚: {e}")
finally:
if 'cursor' in locals():
cursor.close()
第四步:使用上下文管理器 (最佳实践)
手动管理 connection 和 cursor 的打开和关闭很繁琐,并且容易出错,Python 的 with 语句(上下文管理器)可以优雅地解决这个问题。
pyodbc 使用 with 语句
import pyodbc
# 连接字符串 (使用 Windows 身份验证)
conn_str = 'DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes;'
try:
# 'with' 语句会自动处理连接的关闭
with pyodbc.connect(conn_str) as connection:
print("连接已建立")
# 'with' 语句也会自动处理游标的关闭
with connection.cursor() as cursor:
print("游标已创建")
# 执行查询
cursor.execute("SELECT TOP 3 name FROM sys.databases")
# 获取结果
for row in cursor:
print(f"数据库名称: {row[0]}")
# 当离开 'with' 代码块时,连接和游标会自动关闭
print("连接和游标已自动关闭。")
except pyodbc.Error as e:
print(f"发生错误: {e}")
pymssql 使用 with 语句
pymssql 的连接对象本身支持 with 语句。
import pymssql
try:
# 'with' 语句会自动处理连接的关闭
with pymssql.connect(
server='localhost',
database='master',
user='your_username',
password='your_password'
) as connection:
print("连接已建立")
# 需要手动创建游标,但也可以用 'with'
with connection.cursor(as_dict=True) as cursor: # as_dict=True 可以让结果以字典形式返回,更易读
print("游标已创建")
# 执行查询
cursor.execute("SELECT TOP 3 name FROM sys.databases")
# 获取结果
for row in cursor:
print(f"数据库名称: {row['name']}")
print("连接和游标已自动关闭。")
except pymssql.Error as e:
print(f"发生错误: {e}")
第五步:将查询结果转换为 Pandas DataFrame
在数据分析领域,将数据库查询结果直接加载到 Pandas DataFrame 是一个非常常见的操作。
确保您安装了 pandas:
pip install pandas
您可以使用 pandas.read_sql_query 函数,它非常方便。
import pyodbc
import pandas as pd
# 连接字符串
conn_str = 'DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes;'
try:
# 使用 pandas 的 read_sql_query 函数
# 它会自动处理连接的打开和关闭
df = pd.read_sql_query("SELECT TOP 5 name, database_id FROM sys.databases", conn_str)
print("成功将数据加载到 DataFrame:")
print(df)
# 现在您就可以使用所有 pandas 的强大功能了
print("\nDataFrame 的信息:")
print(df.info())
except Exception as e:
print(f"发生错误: {e}")
总结与推荐工作流
- 选择库: 根据您的需求选择
pyodbc(通用) 或pymssql(轻量级)。 - 安装: 运行
pip install <library_name>,如果是pyodbc,务必安装对应的 ODBC 驱动程序。 - 连接: 使用正确的连接信息建立数据库连接。
- 执行操作:
- 查询: 使用
cursor.execute()和fetchall()/fetchone()。 - 增删改: 使用
cursor.execute(),然后调用connection.commit()提交事务。 - 始终使用参数化查询 来防止 SQL 注入。
- 查询: 使用
- 资源管理: 强烈推荐使用
with语句来自动管理连接和游标的生命周期,避免资源泄漏。 - 数据分析: 如果需要,使用
pandas.read_sql_query()直接将数据加载到 DataFrame 中进行分析。
希望这份详细的指南能帮助您在 Python 中顺利地操作 SQL Server 文件(数据库)!
