pyodbc: 一个功能强大、灵活的数据库连接库,它通过 ODBC (Open Database Connectivity) 标准连接数据库,这是最通用和推荐的方式。pymssql: 一个更轻量级的库,它是 SQL Server 的原生 Python 接口,不需要配置 ODBC 驱动,在某些场景下可能更简单。
使用 pyodbc (推荐)
pyodbc 是最灵活、功能最全的方案,适用于各种复杂场景。

步骤 1: 环境准备
-
安装 Python 库 打开你的终端或命令提示符,使用 pip 安装
pyodbc。pip install pyodbc
-
安装 SQL Server ODBC 驱动 Python 需要通过 ODBC 驱动与 SQL Server 通信,你需要根据你的 SQL Server 版本和操作系统下载并安装对应的驱动。
- SQL Server 2012 及以上版本: 推荐使用 ODBC Driver 17 for SQL Server。
- SQL Server 2008 及以上版本: 可以使用 ODBC Driver 13 for SQL Server。
下载地址: Microsoft ODBC Drivers for SQL Server
Windows 用户: 运行安装程序即可。 macOS 用户: 可以使用 Homebrew 安装:
brew install microsoft/mssql-release/msodbcsql17Linux 用户: 可以参考微软官方文档进行安装。
(图片来源网络,侵删)
步骤 2: 连接到 SQL Server
连接字符串是连接数据库的关键,它包含了服务器地址、数据库名、认证方式等信息。
连接字符串模板:
# Windows 身份验证 (推荐在企业内网使用)
# trusted_connection=yes 表示使用当前 Windows 用户的身份登录
conn_str = (
r'DRIVER={ODBC Driver 17 for SQL Server};'
r'SERVER=服务器名称或IP地址;'
r'DATABASE=数据库名称;'
r'Trusted_Connection=yes;'
)
# SQL Server 身份验证 (在公网或需要指定用户名密码时使用)
conn_str = (
r'DRIVER={ODBC Driver 17 for SQL Server};'
r'SERVER=服务器名称或IP地址;'
r'DATABASE=数据库名称;'
r'UID=你的用户名;'
r'PWD=你的密码;'
)
代码示例:
import pyodbc
# 连接字符串 (请替换为你的实际信息)
conn_str = (
r'DRIVER={ODBC Driver 17 for SQL Server};'
r'SERVER=DESKTOP-SOMEPC\SQLEXPRESS;' # localhost\SQLEXPRESS
r'DATABASE=TestDB;'
r'Trusted_Connection=yes;'
)
try:
# 建立连接
conn = pyodbc.connect(conn_str)
print("连接成功!")
# 创建一个游标对象,用于执行 SQL 语句
cursor = conn.cursor()
# --- 执行 SQL 操作 ---
# 示例:创建一个表
cursor.execute('''
IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL
DROP TABLE dbo.Employees;
CREATE TABLE dbo.Employees (
id INT PRIMARY KEY,
name NVARCHAR(50),
department NVARCHAR(50),
hire_date DATE
);
''')
print("表 'Employees' 创建成功。")
# --- 插入数据 ---
# 方式1: 使用参数化查询插入单条数据 (防止 SQL 注入,强烈推荐)
insert_sql = "INSERT INTO Employees (id, name, department, hire_date) VALUES (?, ?, ?, ?)"
employee_data = (1, '张三', '技术部', '2025-01-15')
cursor.execute(insert_sql, employee_data)
# 方式2: 使用 executemany 批量插入多条数据
employees_to_insert = [
(2, '李四', '市场部', '2025-02-20'),
(3, '王五', '人力资源', '2025-03-10'),
(4, '赵六', '技术部', '2025-04-05')
]
cursor.executemany(insert_sql, employees_to_insert)
# 提交事务,否则更改不会保存到数据库
conn.commit()
print(f"成功插入 {cursor.rowcount} 条数据。")
except pyodbc.Error as e:
print(f"数据库操作失败: {e}")
# 如果发生错误,回滚事务
if 'conn' in locals():
conn.rollback()
finally:
# 确保关闭连接
if 'conn' in locals():
conn.close()
print("连接已关闭。")
使用 pymssql (更简单)
pymssql 是一个纯 Python 实现的库,不需要配置 ODBC 驱动,安装和连接都更直接。
步骤 1: 环境准备
- 安装 Python 库
pip install pymssql
步骤 2: 连接到 SQL Server
pymssql 的连接字符串语法与 pyodbc 略有不同,但更简洁。
代码示例:
import pymssql
# 连接参数 (请替换为你的实际信息)
server = 'DESKTOP-SOMEPC\SQLEXPRESS'
database = 'TestDB'
username = None # 如果使用 Windows 身份验证,设为 None
password = None # 如果使用 Windows 身份验证,设为 None
try:
# 建立连接
conn = pymssql.connect(server=server, database=database, user=username, password=password)
print("连接成功!")
# 创建一个游标对象
cursor = conn.cursor()
# --- 执行 SQL 操作 ---
# 示例:创建一个表
cursor.execute('''
IF OBJECT_ID('dbo.Products', 'U') IS NOT NULL
DROP TABLE dbo.Products;
CREATE TABLE dbo.Products (
product_id INT PRIMARY KEY,
product_name NVARCHAR(100),
price DECIMAL(10, 2)
);
''')
print("表 'Products' 创建成功。")
# --- 插入数据 ---
# 方式1: 使用参数化查询
insert_sql = "INSERT INTO Products (product_id, product_name, price) VALUES (%s, %s, %s)"
product_data = (101, '笔记本电脑', 5999.00)
cursor.execute(insert_sql, product_data)
# 方式2: 使用 executemany 批量插入
products_to_insert = [
(102, '无线鼠标', 99.50),
(103, '机械键盘', 459.00),
(104, '4K显示器', 2899.00)
]
cursor.executemany(insert_sql, products_to_insert)
# 提交事务
conn.commit()
print(f"成功插入 {cursor.rowcount} 条数据。")
except pymssql.Error as e:
print(f"数据库操作失败: {e}")
if 'conn' in locals():
conn.rollback()
finally:
# 确保关闭连接
if 'conn' in locals():
conn.close()
print("连接已关闭。")
注意: pymssql 使用 %s 作为占位符,而不是 。
最佳实践与进阶技巧
使用 with 语句管理连接 (推荐)
手动管理 try...finally 来关闭连接容易出错,使用 with 语句可以更安全、更优雅地处理资源。
pyodbc 和 pymssql 的游标对象都支持 with 语句,但连接对象本身不支持,我们可以创建一个上下文管理器来包装连接。
示例 (使用 pyodbc):
import pyodbc
class DBConnection:
def __init__(self, conn_str):
self.conn_str = conn_str
self.conn = None
def __enter__(self):
self.conn = pyodbc.connect(self.conn_str)
return self.conn.cursor() # 返回游标对象
def __exit__(self, exc_type, exc_val, exc_tb):
if self.conn:
if exc_type is not None: # 如果有异常,则回滚
self.conn.rollback()
else:
self.conn.commit() # 否则提交
self.conn.close() # 关闭连接
# 使用方式
conn_str = r'DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost\SQLEXPRESS;DATABASE=TestDB;Trusted_Connection=yes;'
try:
with DBConnection(conn_str) as cursor:
cursor.execute("INSERT INTO Employees (id, name) VALUES (5, '孙七')")
print("数据插入成功,连接已自动管理。")
except pyodbc.Error as e:
print(f"发生错误: {e}")
从 Pandas DataFrame 存入数据库
数据分析中,经常需要将 Pandas DataFrame 的数据存入数据库。pandas 库提供了 to_sql 方法,可以非常方便地实现。
步骤:
- 安装
pandas:pip install pandas - 安装
sqlalchemy:pip install sqlalchemy(pandas 的 to_sql 依赖它)
代码示例:
import pandas as pd
from sqlalchemy import create_engine
# 创建一个示例 DataFrame
data = {
'id': [6, 7, 8],
'name': ['周八', '吴九', '郑十'],
'department': ['财务部', '技术部', '市场部']
}
df = pd.DataFrame(data)
# 创建 SQLAlchemy 引擎
# 格式: mssql+pyodbc://用户名:密码@服务器/数据库?driver=ODBC+Driver+17+for+SQL+Server
# 如果使用 Windows 身份验证,用户名和密码留空
engine = create_engine(
'mssql+pyodbc:///?odbc_connect=' +
r'DRIVER={ODBC Driver 17 for SQL Server};'
r'SERVER=localhost\SQLEXPRESS;'
r'DATABASE=TestDB;'
r'Trusted_Connection=yes;'
)
# 将 DataFrame 存入 SQL Server
# if_exists='replace' 表示如果表已存在则替换它
# index=False 表示不将 DataFrame 的索引列存入数据库
df.to_sql('Employees', con=engine, if_exists='append', index=False)
print("DataFrame 数据已成功追加到 'Employees' 表中。")
故障排除
DataError: (source_name, odbc_code, message): 这通常是 ODBC 驱动问题。- 检查驱动名称: 确保
DRIVER={...}中的名称与你安装的驱动名称完全一致(包括大小写和空格)。 - 重新安装驱动: 尝试重新安装最新的 ODBC 驱动。
- 检查驱动名称: 确保
Login failed for user '...': 登录失败。- 检查用户名密码: 确认用户名和密码是否正确。
- 检查服务器名: 确认服务器名称或 IP 地址是否正确,以及 SQL Server 是否允许远程连接。
- 检查身份验证模式: 确认你使用的是 Windows 身份验证还是 SQL Server 身份验证,并确保你的用户有对应的权限。
Network-related or instance-specific error: 网络或实例相关错误。- 检查 SQL Server 服务: 确认你的 SQL Server 服务是否正在运行。
- 检查防火墙: 确认防火墙没有阻止 1433 端口(SQL Server 默认端口)。
- 检查实例名: 如果你使用的是命名实例(如
localhost\SQLEXPRESS),确保实例名拼写正确。
希望这份详细的指南能帮助你顺利地在 Python 中将数据存入 SQL Server!
