杰瑞科技汇

Python如何存入SQLServer?

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

使用 pyodbc (推荐)

pyodbc 是最灵活、功能最全的方案,适用于各种复杂场景。

Python如何存入SQLServer?-图1
(图片来源网络,侵删)

步骤 1: 环境准备

  1. 安装 Python 库 打开你的终端或命令提示符,使用 pip 安装 pyodbc

    pip install pyodbc
  2. 安装 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/msodbcsql17 Linux 用户: 可以参考微软官方文档进行安装。

    Python如何存入SQLServer?-图2
    (图片来源网络,侵删)

步骤 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: 环境准备

  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 语句可以更安全、更优雅地处理资源。

pyodbcpymssql 的游标对象都支持 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 方法,可以非常方便地实现。

步骤:

  1. 安装 pandas: pip install pandas
  2. 安装 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!

分享:
扫描分享到社交APP
上一篇
下一篇