在本快速入门中,将 Python 脚本连接到使用示例数据创建和加载的数据库。 使用适用于 Python 的 mssql-python 驱动程序连接到数据库并执行基本作,例如读取和写入数据。
mssql-python 文档 | mssql-python 源代码 | 包 (PyPi)
先决条件
- Python 3 - 如果还没有 Python,请根据 python.org 安装 Python 运行时和 Python Package Index (PyPI) 包管理器。 
- 不想使用自己的环境? 使用 GitHub Codespaces 以 devcontainer 身份打开。 
 
- 一个基于 SQL Server、Azure SQL 数据库或 Fabric 中的 SQL 数据库的数据库,包含 - AdventureWorks2022示例架构和有效的连接字符串。
设置
按照以下步骤配置开发环境,以使用 mssql-python Python 驱动程序开发应用程序。
注释
此驱动程序使用 表格数据流(TDS) 协议,该协议默认在 SQL Server、Fabric 中的 SQL 数据库和 Azure SQL 数据库中启用。 无需进行额外配置。
安装 mssql-python 包
从 PyPI 获取 mssql-python 包。
- 在空目录中打开命令提示符。 
- 安装 - mssql-python包。- pip install mssql-python
安装 python-dotenv 包
从 PyPI 获取 python-dotenv。
- 在同一目录中,安装 - python-dotenv包。- pip install python-dotenv
检查已安装的包
可以使用 PyPI 命令行工具验证所需的包是否已安装。
- 使用 - pip list检查已安装的包列表。- pip list
创建 SQL 数据库
本快速入门要求在 Microsoft SQL Server、Fabric 或 Azure SQL 数据库中的 SQL 数据库上使用 AdventureWorks2022 轻型 架构。
运行代码
创建新文件
- 创建名为 - app.py的新文件。
- 添加模块 docstring。 - """ Connects to a SQL database using mssql-python """
- 导入包,包括 - mssql-python。- from os import getenv from dotenv import load_dotenv from mssql_python import connect
- 使用 - mssql-python.connect函数连接到 SQL 数据库。- load_dotenv() conn = connect(getenv("SQL_CONNECTION_STRING"))
- 在当前目录中,创建一个名为 - .env的新文件。
- 在 - .env文件中,添加一个名为- SQL_CONNECTION_STRING的连接字符串条目。 将此处的示例替换为实际连接字符串值。- SQL_CONNECTION_STRING="Server=<server_name>;Database={<database_name>};Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"- 小窍门 - 此处使用的连接字符串在很大程度上取决于要连接到的 SQL 数据库的类型。 如果要连接到 Fabric 中的 Azure SQL 数据库 或 SQL 数据库,请使用连接字符串选项卡中的 ODBC 连接字符串。可能需要根据方案调整身份验证类型。 有关连接字符串及其语法的详细信息,请参阅 连接字符串语法参考。 
执行查询
使用 SQL 查询字符串执行查询并解析结果。
- 为 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; """
- 使用 - cursor.execute从数据库查询中检索结果集。- cursor = conn.cursor() cursor.execute(SQL_QUERY)- 注释 - 此函数实质上接受任意查询,并返回可使用 cursor.fetchone() 循环访问的结果集。 
- 与 - cursor.fetchall循环一起使用- foreach,从数据库中获取所有记录。 然后打印记录。- records = cursor.fetchall() for r in records: print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
- app.py文件。
- 打开终端并测试应用程序。 - 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 注入 攻击。
- 将 - randrange从- random库中导入,并添加到- app.py的顶部。- from random import randrange
- 在 - app.py末尾添加代码以生成随机的产品编号。- productNumber = randrange(1000)- 小窍门 - 在此处生成随机的产品编号可确保可以多次运行此示例。 
- 创建 SQL 语句字符串。 - SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP) """
- 使用 - cursor.execute执行该语句。- cursor.execute( SQL_STATEMENT, ( f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 ) )
- 使用 - cursor.fetchone提取单个结果,打印结果的唯一标识符,然后使用- connection.commit将该操作作为事务提交。- result = cursor.fetchone() print(f"Inserted Product ID : {result['ProductID']}") conn.commit()- 小窍门 - 也可选择使用 - connection.rollback回滚该事务。
- 使用 - cursor.close和- connection.close关闭游标和连接。- cursor.close() conn.close()
- app.py文件并再次测试应用程序。- python app.py- 下面是预期的输出。 - Inserted Product ID : 1001
后续步骤
访问mssql-python 驱动程序的 GitHub 存储库以获取更多示例,并贡献想法或报告问题。