杰瑞科技汇

python sqlserver文件

核心概念

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

python sqlserver文件-图1
(图片来源网络,侵删)
  1. pyodbc: 这是一个非常流行的、功能强大的数据库连接库,它提供了一个标准的 Python DB-API 2.0 接口,可以连接到各种数据库,包括 SQL Server,它使用微软官方的 ODBC 驱动程序。
  2. 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 sqlserver文件-图2
(图片来源网络,侵删)
  1. 安装 Python 库: 打开您的终端或命令提示符,运行以下命令:

    pip install pyodbc
  2. 安装 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 sqlserver文件-图3
(图片来源网络,侵删)
  1. 安装 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()

第四步:使用上下文管理器 (最佳实践)

手动管理 connectioncursor 的打开和关闭很繁琐,并且容易出错,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}")

总结与推荐工作流

  1. 选择库: 根据您的需求选择 pyodbc (通用) 或 pymssql (轻量级)。
  2. 安装: 运行 pip install <library_name>,如果是 pyodbc务必安装对应的 ODBC 驱动程序
  3. 连接: 使用正确的连接信息建立数据库连接。
  4. 执行操作:
    • 查询: 使用 cursor.execute()fetchall()/fetchone()
    • 增删改: 使用 cursor.execute(),然后调用 connection.commit() 提交事务。
    • 始终使用参数化查询 来防止 SQL 注入。
  5. 资源管理: 强烈推荐使用 with 语句来自动管理连接和游标的生命周期,避免资源泄漏。
  6. 数据分析: 如果需要,使用 pandas.read_sql_query() 直接将数据加载到 DataFrame 中进行分析。

希望这份详细的指南能帮助您在 Python 中顺利地操作 SQL Server 文件(数据库)!

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