快速入门:使用适用于 Python 的 mssql-python 驱动程序进行连接

在本快速入门中,将 Python 脚本连接到使用示例数据创建和加载的数据库。 使用适用于 Python 的 mssql-python 驱动程序连接到数据库并执行基本作,例如读取和写入数据。

驱动程序 mssql-python 不需要 Windows 计算机上的任何外部依赖项。 驱动程序通过单个 pip 安装来安装它所需的一切,使你能够将最新版本的驱动程序用于新脚本,同时不会影响那些没有时间升级和测试的其他脚本。

本文中的本地SQL认证示例仅用于针对你控制的SQL Server实例进行本地开发。 对于Azure SQL 数据库、Fabric中的SQL数据库、共享开发环境、CI和生产部署,建议从Microsoft Entra认证或其他无密码流程开始。

mssql-python 文档 | mssql-python 源代码 | 包 (PyPI) | Visual Studio Code

先决条件

在SQL Server、Azure SQL 数据库或Fabric中的SQL数据库中创建或连接数据库。 按照以下步骤,用示例模式搭建数据库AdventureWorks2025,并保留连接字符串以备后用。

创建 SQL 数据库

在以下平台之一创建或连接SQL数据库:

设置

按照以下步骤配置开发环境,以使用 mssql-python Python 驱动程序开发应用程序。

注释

该驱动程序使用 表格数据流(TDS) 协议。 SQL Server、Fabric 中的 SQL 数据库和 Azure SQL 数据库 默认启用 TDS,因此无需额外配置。

安装 mssql-python 包

从 PyPI 获取 mssql-python

  1. 在空目录中打开命令提示符。

  2. 安装 mssql-python 包。

    pip install mssql-python
    

安装python-dotenv包

从 PyPI 获取 python-dotenv 软件包。

  1. 在同一目录中,安装 python-dotenv 包。

    pip install python-dotenv
    

检查已安装的包

可以使用 PyPI 命令行工具验证所需的包是否已安装。

  1. 使用 pip list 检查已安装的包列表。

    pip list
    

运行代码

创建新文件

  1. 创建名为 app.py 的新文件。

  2. 添加模块 docstring。

    """
    Connects to a SQL database using mssql-python
    """
    
  3. 导入包,包括 mssql-python

    from os import getenv
    from dotenv import load_dotenv
    from mssql_python import connect
    
  4. 使用 mssql-python.connect 函数连接到 SQL 数据库。

    load_dotenv()
    conn = connect(getenv("SQL_CONNECTION_STRING"))
    
  5. 在当前目录中,创建一个名为 .env 的新文件。

  6. .env 文件中,添加一个名为 SQL_CONNECTION_STRING 的连接字符串条目。 请使用以下例子之一,并用你的实际值替换占位符。

    对于Azure SQL 数据库或Fabric中的SQL数据库,请先使用Microsoft Entra认证:

    SQL_CONNECTION_STRING="Server=<server_name>;Database=<database_name>;Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"
    

    在本地 SQL Server 开发阶段,首先要从 SQL 认证开始:

    SQL_CONNECTION_STRING="Server=localhost,1433;Database=<database_name>;UID=<username>;PWD=<password>;Encrypt=yes;TrustServerCertificate=yes"
    

    注意

    应视 .env 为本地开发便利,而非部署机制。 切勿提交,切勿在共享或生产环境中重复使用此SQL认证示例,且在本地开发外保持证书验证开启。

    使用 连接字符串 将样本调整为命名实例、容器或高级设置。 如果要连接到 Azure SQL 数据库 或 Fabric 中的 SQL 数据库,请使用Microsoft Entra 身份验证进行无密码和交互式登录。 有关更广泛的秘密和证书指导,请参见 安全最佳实践

执行查询

使用 SQL 查询字符串执行查询并解析结果。

  1. 为 SQL 查询字符串创建变量。

    SQL_QUERY = """
    SELECT
    TOP 5 c.CustomerID,
    c.CompanyName,
    COUNT(soh.SalesOrderID) AS OrderCount
    FROM
    SalesLT.Customer AS c
    LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID
    GROUP BY
    c.CustomerID,
    c.CompanyName
    ORDER BY
    OrderCount DESC;
    """
    
  2. 使用 cursor.execute 从数据库查询中检索结果集。

    cursor = conn.cursor()
    cursor.execute(SQL_QUERY)
    

    注释

    该函数本质上接受任何查询并返回结果集。 要遍历结果集,可以使用 cursor.fetchone()

  3. cursor.fetchall 循环一起使用 for,从数据库中获取所有记录。 然后,打印记录。

    records = cursor.fetchall()
    for r in records:
      print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
    
  4. app.py文件。

    小窍门

    在 macOS 上, ActiveDirectoryInteractiveActiveDirectoryDefault 都可用于 Microsoft Entra 身份验证。 ActiveDirectoryInteractive 每次运行脚本时都会提示你登录。 为避免重复登录提示,请通过Azure CLI运行 az login,然后使用ActiveDirectoryDefault,该登录可重复使用缓存的凭证。

  5. 打开终端并测试应用程序。

    python app.py
    

    下面是预期的输出。

    29485   1       Professional Sales and Service
    29531   1       Remarkable Bike Store
    29546   1       Bulk Discount Store
    29568   1       Coalition Bike Company
    29584   1       Futuristic Bikes
    

插入一行作为事务

安全地执行 INSERT 语句并传递参数。 将参数作为值传递可保护应用程序免受 SQL 注入 攻击。

  1. randrangerandom库中导入,并添加到app.py的顶部。

    from random import randrange
    
  2. app.py 末尾添加代码以生成随机的产品编号。

    productNumber = randrange(1000)
    

    小窍门

    在此处生成随机的产品编号可确保可以多次运行此示例。

  3. 创建 SQL 语句字符串。

    SQL_STATEMENT = """
    INSERT SalesLT.Product (
    Name,
    ProductNumber,
    StandardCost,
    ListPrice,
    SellStartDate
    ) OUTPUT INSERTED.ProductID
    VALUES (%(name)s, %(product_number)s, %(standard_cost)s, %(list_price)s, CURRENT_TIMESTAMP)
    """
    
  4. 使用 cursor.execute 执行该语句。

    cursor.execute(
       SQL_STATEMENT,
       {
          'name': f'Example Product {productNumber}',
          'product_number': f'EXAMPLE-{productNumber}',
          'standard_cost': 100,
          'list_price': 200
       }
    )
    
  5. 使用 cursor.fetchone 提取单个结果,打印结果的唯一标识符,然后使用 connection.commit 将该操作作为事务提交。

    result = cursor.fetchone()
    print(f"Inserted Product ID : {result.ProductID}")
    conn.commit()
    

    小窍门

    也可选择使用 connection.rollback 回滚该事务。

  6. 使用 cursor.closeconnection.close 关闭游标和连接。

    cursor.close()
    conn.close()
    
  7. app.py文件并再次测试应用程序。

    python app.py
    

    下面是预期的输出。

    Inserted Product ID : 1001
    

后续步骤

通过这些文章继续深入学习:

  • 连接字符串用于适配本地SQL Server、Azure SQL、容器和命名实例。
  • 连接管理,使用上下文管理器、连接池和连接设置。
  • 故障排除,用于诊断身份验证、证书和连接问题。