杰瑞科技汇

Python如何操作SQLServer数据库?

  1. pyodbc: 这是一个通用的数据库连接库,支持 ODBC (Open Database Connectivity) 标准,它功能强大、性能优秀,是许多生产环境的首选。
  2. pymssql: 这是一个纯 Python 实现的 SQL Server 驱动库,它的优点是安装简单(不需要配置 ODBC),轻量级,非常适合快速开发和部署。

下面我将详细介绍这两种方法,并提供完整的代码示例。

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

准备工作:安装驱动

无论使用哪种库,你都需要确保你的系统上安装了正确的 SQL Server ODBC 驱动。

Windows:

  1. 访问 Microsoft 官方下载页面:ODBC Driver for SQL Server
  2. 下载并安装最新版本的 "OD Driver 18 for SQL Server",安装过程非常简单,一路点击 "下一步" 即可。

Linux (以 Ubuntu 为例):

# 1. 下载 Microsoft 仓库的 GPG 密钥
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
# 2. 添加仓库
sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list)"
# 3. 更新包列表并安装驱动
sudo apt-get update
sudo apt-get install mssql-tools unixodbc-dev

macOS (使用 Homebrew):

Python如何操作SQLServer数据库?-图2
(图片来源网络,侵删)
# 1. 添加 Microsoft 的 tap
brew tap microsoft/mssql-release
# 2. 运行脚本以接受许可条款并安装驱动
brew install msodbcsql17 mssql-tools

使用 pyodbc (推荐)

pyodbc 是功能最全、社区最活跃的库,推荐在生产环境中使用。

安装 pyodbc

pip install pyodbc

连接字符串

连接字符串是关键,格式通常为: DRIVER={...};SERVER=...;DATABASE=...;UID=...;PWD=...

  • DRIVER: 指定你安装的 ODBC 驱动名,对于新版的 Driver 18,通常是 ODBC Driver 18 for SQL Server
  • SERVER: 你的 SQL Server 地址,可以是服务器名、IP 地址或 localhost
  • DATABASE: 你要连接的数据库名。
  • UID: 用户名。
  • PWD: 密码。

注意: 如果你的 SQL Server 配置为 Windows 身份验证,则不需要 UIDPWD,而是需要 Trusted_Connection=yes

完整代码示例

import pyodbc
import pandas as pd # 可选,用于将结果转为DataFrame
# --- 1. 定义连接字符串 ---
# 使用 SQL Server 身份验证
# connection_string = "DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;DATABASE=YourDatabase;UID=your_username;PWD=your_password;TrustServerCertificate=yes"
# 使用 Windows 身份验证 (更推荐在企业环境中使用)
# TrustServerCertificate=yes 用于跳过 SSL 证书验证,在本地开发时很方便
connection_string = "DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;DATABASE=master;Trusted_Connection=yes;TrustServerCertificate=yes"
# --- 2. 建立连接 ---
try:
    conn = pyodbc.connect(connection_string)
    print("连接成功!")
    # 使用 'with' 语句可以确保游标和连接在使用后被正确关闭
    with conn:
        cursor = conn.cursor()
        # --- 3. 执行 SQL 查询 ---
        print("\n--- 执行查询 ---")
        sql_query = "SELECT TOP 3 name, database_id FROM sys.databases;"
        cursor.execute(sql_query)
        # --- 4. 获取并处理结果 ---
        print("\n--- 查询结果 ---")
        rows = cursor.fetchall()
        for row in rows:
            print(f"数据库: {row.name}, ID: {row.database_id}")
        # --- 5. 执行参数化查询 (防止 SQL 注入) ---
        print("\n--- 执行参数化查询 ---")
        # 使用 ? 作为占位符
        param_query = "SELECT * FROM YourTable WHERE YourColumn = ?;"
        param_value = 'some_value'
        cursor.execute(param_query, param_value)
        # 将结果直接读取到 Pandas DataFrame (非常方便)
        df = pd.read_sql(param_query, conn, params=[param_value])
        print("\nPandas DataFrame 结果:")
        print(df)
        # --- 6. 执行插入操作 ---
        print("\n--- 执行插入操作 ---")
        insert_query = "INSERT INTO YourTable (Column1, Column2) VALUES (?, ?);"
        data_to_insert = ('Value A', 123)
        cursor.execute(insert_query, data_to_insert)
        # 提交事务!对于增删改操作,必须调用 commit() 才能生效
        conn.commit()
        print("插入成功!")
except pyodbc.Error as e:
    print(f"数据库操作失败: {e}")
    # 如果发生错误,可以回滚事务
    # if conn:
    #     conn.rollback()
finally:
    # --- 7. 关闭连接 ---
    if 'conn' in locals() and conn:
        conn.close()
        print("\n连接已关闭。")

使用 pymssql

pymssql 更轻量级,安装和配置都更简单,适合不希望处理 ODBC 驱动配置的场景。

安装 pymssql

pip install pymssql

连接字符串

pymssql 的连接方式更直接,直接作为参数传递给 connect 函数。

完整代码示例

import pymssql
import pandas as pd # 可选
# --- 1. 定义连接参数 ---
server = 'localhost'
user = 'your_username'
password = 'your_password'
database = 'YourDatabase'
# --- 2. 建立连接 ---
conn = None
try:
    conn = pymssql.connect(server=server, user=user, password=password, database=database)
    print("连接成功!")
    # 使用 'with' 语句可以确保游标和连接在使用后被正确关闭
    with conn.cursor(as_dict=True) as cursor: # as_dict=True 让结果以字典形式返回,更易读
        # --- 3. 执行 SQL 查询 ---
        print("\n--- 执行查询 ---")
        sql_query = "SELECT TOP 3 name, database_id FROM sys.databases;"
        cursor.execute(sql_query)
        # --- 4. 获取并处理结果 ---
        print("\n--- 查询结果 ---")
        rows = cursor.fetchall()
        for row in rows:
            print(f"数据库: {row['name']}, ID: {row['database_id']}")
        # --- 5. 执行参数化查询 ---
        print("\n--- 执行参数化查询 ---")
        # 使用 %s 作为占位符
        param_query = "SELECT * FROM YourTable WHERE YourColumn = %s;"
        param_value = 'some_value'
        cursor.execute(param_query, param_value)
        # 读取到 Pandas DataFrame
        df = pd.read_sql(param_query, conn, params=(param_value,))
        print("\nPandas DataFrame 结果:")
        print(df)
        # --- 6. 执行插入操作 ---
        print("\n--- 执行插入操作 ---")
        insert_query = "INSERT INTO YourTable (Column1, Column2) VALUES (%s, %s);"
        data_to_insert = ('Value B', 456)
        cursor.execute(insert_query, data_to_insert)
        # 提交事务
        conn.commit()
        print("插入成功!")
except pymssql.Error as e:
    print(f"数据库操作失败: {e}")
    # 如果发生错误,可以回滚事务
    # if conn:
    #     conn.rollback()
finally:
    # --- 7. 关闭连接 ---
    if conn:
        conn.close()
        print("\n连接已关闭。")

pyodbc vs pymssql 对比

特性 pyodbc pymssql
依赖 需要 ODBC 驱动 (ODBC Driver 18) 纯 Python,无外部依赖
安装 pip install pyodbc + 安装 ODBC 驱动 pip install pymssql
性能 通常更高,底层是 C 实现 纯 Python,性能稍低
功能 非常全面,支持所有 ODBC 特性 功能齐全,但可能缺少一些高级 ODBC 特性
连接方式 通过连接字符串 通过关键字参数
参数化查询 使用 占位符 使用 %s 占位符
结果游标 返回元组列表 默认返回元组列表,可设为 as_dict=True 返回字典
适用场景 生产环境、高性能要求、复杂操作 快速开发、简单任务、环境配置困难的场景
  1. 首选 pyodbc: 除非你有非常明确的理由(例如无法安装 ODBC 驱动),否则 pyodbc 是更稳定、功能更强大的选择。
  2. 始终使用参数化查询: 永远不要用 Python 字符串拼接来构建 SQL 语句,这极易导致 SQL 注入攻击,始终使用 (pyodbc) 或 %s (pymssql) 作为占位符。
  3. 使用 with 语句: 它能自动管理游标和连接的生命周期,即使发生异常也能确保资源被正确释放。
  4. 记得 commit(): 在执行 INSERT, UPDATE, DELETE 操作后,必须调用 conn.commit() 来提交事务,否则更改不会持久化到数据库。
  5. 处理异常: 将数据库操作放在 try...except 块中,以捕获并处理可能发生的错误(如连接失败、SQL 语法错误等)。
  6. 结合 Pandas: 如果需要进行数据分析,使用 pd.read_sql() 可以非常方便地将查询结果直接加载到 DataFrame 中。
分享:
扫描分享到社交APP
上一篇
下一篇