通过 Python 开始使用 Azure 表存储

Tip

本文中的内容适用于原始的 Azure 表存储。

Azure 表存储是一项用于在云中存储结构化 NoSQL 数据的服务,通过无架构设计提供键/属性存储。 因为表存储无架构,因此可以很容易地随着应用程序需求的发展使数据适应存储。 对于许多类型的应用程序来说,访问表存储数据速度快且经济高效,在数据量相似的情况下,其成本通常比传统 SQL 要低。

可以使用表存储来存储灵活的数据集,例如 Web 应用程序的用户数据、通讯簿、设备信息,或者服务需要的其他类型的元数据。 可以在表中存储任意数量的实体,并且一个存储帐户可以包含任意数量的表,直至达到存储帐户的容量极限。

关于本教程

本教程介绍如何在常见的 Azure 表存储方案中使用适用于 Python 的 Azure Cosmos DB 表 SDK。 该 SDK 的名称表示它适合与 Azure Cosmos DB 配合使用,但其实该 SDK 既适合与 Azure Cosmos DB 配合使用,也适合与 Azure 表存储配合使用,只不过每个服务具有唯一的终结点。 本文使用 Python 示例探索这些方案,以演示如何:

  • 创建和删除表
  • 插入和查询实体
  • 修改实体

浏览本教程中的方案时,可能需要参考用于 Python API 的 Azure Cosmos DB SDK 参考

先决条件

若要成功完成本教程,需要具备以下先决条件:

什么是表存储

Azure 表存储可存储大量结构化数据。 该服务是一个 NoSQL 数据存储,接受来自 Azure 云内部和外部的通过验证的呼叫。 Azure 表最适合存储结构化非关系型数据。 表存储的常见用途包括:

  • 存储 TB 量级的结构化数据,能够为 Web 规模应用程序提供服务
  • 存储无需复杂联接、外键或存储过程,并且可以对其进行非规范化以实现快速访问的数据集
  • 使用聚集索引快速查询数据
  • 使用 OData 协议和 LINQ 查询以及 WCF 数据服务 .NET 库访问数据

可以使用表存储来存储和查询大型结构化非关系型数据集,并且表会随着需求的增加而扩展。

表存储概念

表存储包含以下组件:

表存储组件图

  • URL 格式:Azure 表存储帐户使用此格式:http://<storage account>.table.core.chinacloudapi.cn/<table>

    可以直接使用此地址和 OData 协议来访问 Azure 表。 有关详细信息,请参阅 OData.org

  • 帐户:对 Azure 存储进行的所有访问都要通过存储帐户完成。 有关存储帐户容量的详细信息,请参阅 Azure 存储可伸缩性和性能目标
  • :表是实体的集合。 表不对实体强制实施架构,这意味着单个表可以包含具有不同属性集的实体。
  • 实体:与数据库行类似,一个实体就是一组属性。 Azure 存储中的实体大小最大可以为 1MB。
  • 属性:属性是名称/值对。 每个实体最多可包含 252 个用于存储数据的属性。 每个实体还具有三个系统属性,分别指定分区键、行键和时间戳。 对具有相同分区键的实体的查询速度将更快,并且可以在原子操作中插入/更新这些实体。 一个实体的行键是它在一个分区内的唯一标识符。

有关命名表和属性的详细信息,请参阅 了解表服务数据模型

创建 Azure 服务帐户

可以通过 Azure 表存储使用表。 需要为所要使用的服务创建一个帐户。

创建 Azure 存储帐户

创建第一个 Azure 存储帐户的最简单方法是使用 Azure 门户。 若要了解更多信息,请参阅 创建存储帐户

也可以使用 Azure PowerShellAzure CLI 创建 Azure 存储帐户。

如果暂时不想创建存储帐户,也可以使用 Azure 存储模拟器在本地环境中运行和测试代码。 有关详细信息,请参阅 使用 Azure 存储模拟器进行开发和测试

安装用于 Python 的 Azure Cosmos DB 表 SDK

创建存储帐户后,下一步是安装用于 Python 的 Azure Cosmos DB 表 SDK。 有关安装该 SDK 的详细信息,请参阅 GitHub 上用于 Python 的 Cosmos DB 表 SDK 存储库中的 README.rst 文件。

导入 TableService 和 Entity 类

若要通过 Python 使用 Azure 表服务中的实体,请使用 TableServiceEntity 类。 将此代码添加到 Python 文件顶部附近,以便同时导入:

from azure.cosmosdb.table.tableservice import TableService
from azure.cosmosdb.table.models import Entity

连接到 Azure 表服务

若要连接到 Azure 存储表服务,请创建 TableService 对象,并传入存储帐户名称和帐户密钥。 将 myaccountmykey 替换为自己的帐户名和密钥。

table_service = TableService(account_name='myaccount', account_key='mykey',endpoint_suffix='core.chinacloudapi.cn')

创建表

调用 create_table 创建表。

table_service.create_table('tasktable')

将实体添加到表

若要添加实体,请先创建一个表示实体的对象,然后将该对象传递给 TableService.insert_entity 方法。 实体对象可以是一个实体类型的字典和对象,且可定义实体的属性名和值。 除了为实体定义的任何其他属性外,每个实体还必须包含 PartitionKey 和 RowKey 属性。

此示例将创建一个表示实体的字典对象,并将该对象传递给 insert_entity 方法以将其添加到表:

task = {'PartitionKey': 'tasksSeattle', 'RowKey': '001', 'description' : 'Take out the trash', 'priority' : 200}
table_service.insert_entity('tasktable', task)

此示例将创建一个实体对象,并将该对象传递给 insert_entity 方法以将其添加到表:

task = Entity()
task.PartitionKey = 'tasksSeattle'
task.RowKey = '002'
task.description = 'Wash the car'
task.priority = 100
table_service.insert_entity('tasktable', task)

PartitionKey 和 RowKey

必须为每个实体同时指定 PartitionKey 和 RowKey 属性。 这些是实体的唯一标识符,它们一起构成了实体的主键。 由于只对这些属性编制了索引,因此可使用这些值进行查询,速度比查询任何其他实体属性都要快。

表服务使用 PartitionKey 在存储节点中智能分发。 具有相同的 PartitionKey 的实体存储在同一个节点上。 RowKey 是实体在其所属分区内的唯一 ID。

更新条目

若要更新实体的所有属性值,请调用 update_entity 方法。 此示例演示如何使用更新版本替换现有实体:

task = {'PartitionKey': 'tasksSeattle', 'RowKey': '001', 'description' : 'Take out the garbage', 'priority' : 250}
table_service.update_entity('tasktable', task)

如果要更新的实体不存在,更新操作将失败。 如果要存储实体,无论它是否已存在,请使用 insert_or_replace_entity。 在下面的示例中,第一次调用会替换现有实体。 第二个调用将插入新实体,因为表中不存在具有指定 PartitionKey 和 RowKey 的实体。

# Replace the entity created earlier
task = {'PartitionKey': 'tasksSeattle', 'RowKey': '001', 'description' : 'Take out the garbage again', 'priority' : 250}
table_service.insert_or_replace_entity('tasktable', task)

# Insert a new entity
task = {'PartitionKey': 'tasksSeattle', 'RowKey': '003', 'description' : 'Buy detergent', 'priority' : 300}
table_service.insert_or_replace_entity('tasktable', task)

Tip

update_entity 方法将替换现有实体的所有属性和值,还可将其用于从现有实体中删除属性。 可以使用 merge_entity 方法更新含新的或修改后的属性值的现有实体,而无需彻底替换该实体。

修改多个实体

若要确保通过表服务进行原子处理,可以批量同时提交多个操作。 首先,使用 TableBatch 类将多个操作添加到单个批处理中。 接下来,调用 TableService.commit_batch 以原子操作的形式提交操作。 批处理中要修改的实体必须位于同一分区。

该示例将两个实体一起添加到批处理中:

from azure.cosmosdb.table.tablebatch import TableBatch
batch = TableBatch()
task004 = {'PartitionKey': 'tasksSeattle', 'RowKey': '004', 'description' : 'Go grocery shopping', 'priority' : 400}
task005 = {'PartitionKey': 'tasksSeattle', 'RowKey': '005', 'description' : 'Clean the bathroom', 'priority' : 100}
batch.insert_entity(task004)
batch.insert_entity(task005)
table_service.commit_batch('tasktable', batch)

还可以通过上下文管理器语法来使用批处理:

task006 = {'PartitionKey': 'tasksSeattle', 'RowKey': '006', 'description' : 'Go grocery shopping', 'priority' : 400}
task007 = {'PartitionKey': 'tasksSeattle', 'RowKey': '007', 'description' : 'Clean the bathroom', 'priority' : 100}

with table_service.batch('tasktable') as batch:
    batch.insert_entity(task006)
    batch.insert_entity(task007)

查询实体

要查询表中的实体,请将 PartitionKey 和 RowKey 传递给 TableService.get_entity 方法。

task = table_service.get_entity('tasktable', 'tasksSeattle', '001')
print(task.description)
print(task.priority)

查询一组条目

在筛选器字符串中提供 filter 参数,可以查询一组实体。 此示例通过对 PartitionKey 应用筛选器来查找 Seattle 中的所有任务:

tasks = table_service.query_entities('tasktable', filter="PartitionKey eq 'tasksSeattle'")
for task in tasks:
    print(task.description)
    print(task.priority)

查询一部分实体属性

还可以限制查询中每个实体所返回的属性。 此方法称为“投影”,可减少带宽并提高查询性能,尤其适用于大型实体或结果集。 使用 select 参数并传递希望返回给客户端的属性的名称。

以下代码中的查询只返回表中实体的说明。

Note

下面的代码段仅对 Azure 存储有效。 但不受存储模拟器支持。

tasks = table_service.query_entities('tasktable', filter="PartitionKey eq 'tasksSeattle'", select='description')
for task in tasks:
    print(task.description)

删除条目

将实体的 PartitionKeyRowKey 传递给 delete_entity 方法,以删除该实体。

table_service.delete_entity('tasktable', 'tasksSeattle', '001')

删除表

如果不再需要表或表中的所有实体,请调用 delete_table方法,从 Azure 存储永久删除该表。

table_service.delete_table('tasktable')

后续步骤