杰瑞科技汇

Python如何连接SQLServer数据库?

使用 pyodbc (推荐)

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

Python如何连接SQLServer数据库?-图1
(图片来源网络,侵删)

安装 ODBC 驱动

这是使用 pyodbc前提条件

  • Windows: 通常已经预装了,如果没有,可以从微软官网下载 OD Driver for SQL Server

  • Linux: 可以使用 apt-getyum 安装。

    # 对于 Ubuntu/Debian
    sudo apt-get update
    sudo apt-get install unixodbc-dev odbcinst
    # 下载并安装 Microsoft ODBC Driver for SQL Server
    # 你可以找到 .deb 包并安装,或者按照微软官方文档进行操作
  • macOS: 可以使用 Homebrew 安装。

    Python如何连接SQLServer数据库?-图2
    (图片来源网络,侵删)
    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 是一个非常好的选择。

最佳实践

  1. 使用 try...except...finally:这是处理数据库连接和操作的黄金法则,它能确保即使在发生错误时,连接也能被正确关闭,避免资源泄漏。
  2. 使用上下文管理器 (with 语句)pymssql 的游标支持 with 语句,可以自动处理游标的关闭。pyodbc 的游标也可以通过类似方式实现。
  3. 使用参数化查询永远不要用字符串拼接来构建 SQL 语句! 这会导致严重的 SQL 注入风险,两种库都支持参数化查询。
    • pyodbc: 使用 作为占位符。
    • pymssql: 使用 %s 作为占位符。
  4. 及时提交或回滚:在执行 INSERTUPDATEDELETE 操作后,必须调用 conn.commit() 来保存更改,如果发生错误,调用 conn.rollback() 来撤销未提交的操作。
  5. 连接池:在 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 驱动,请确保:

  1. 你已经正确安装了 ODBC 驱动。
  2. 连接字符串中的 DRIVER 名称与系统中注册的驱动名称完全一致,你可以在系统 ODBC 数据源管理器中查看已安装的驱动名称。

Q2: pymssql.OperationalError: (20009, b'DB-Lib error message 20009, severity 9:\nAdaptive Server connection failed') A2: 这通常意味着无法连接到 SQL Server 服务器,请检查:

  1. 服务器地址 (server) 是否正确。
  2. SQL Server 服务是否正在运行。
  3. 防火墙是否阻止了端口(默认是 1433)。
  4. 用户名和密码是否正确。

Q3: 如何处理 Windows 身份验证? A3: 对于 Windows 身份验证,你不需要提供用户名和密码。

  • pyodbc: 连接字符串中省略 UIDPWD,并使用 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 是更简单、更可靠的选择。
分享:
扫描分享到社交APP
上一篇
下一篇