選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

使用 Python 和肉毒桿菌 3 對 Amazon DynamoDB 進行編程

焦點模式
使用 Python 和肉毒桿菌 3 對 Amazon DynamoDB 進行編程 - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本指南為想要將 Amazon DynamoDB 與 Python 搭配使用的程式設計師提供了一個方向。瞭解不同的抽象層、組態管理、錯誤處理、控制重試原則、管理保持活動狀態等。

關於博托

您可以使用適用於 Python 的官方 AWS 開發套件 (通常稱為 Boto3),從 Python 存取 DynamoDB。Boto(發音為 boh-toh)這個名字來自 Amazon 河原產的淡水海豚。Boto3 圖書館是圖書館的第三個主要版本,於 2015 年首次發布。Boto3 程式庫相當龐大,因為它支援所有 AWS 服務,而不僅僅是 DynamoDB。此方向僅針對與 DynamoDB 相關的肉毒桿 3 部分。

Boto 由 AWS 作為託管的開源項目進行維護和發布。 GitHub它被分成兩個軟件包:肉毒核和 Boto3

  • 肉毒核提供了低級別的功能。在 Botocore 中,您將找到客戶端,會話,憑據,配置和異常類。

  • 肉毒桿菌 3 建立在肉毒核之上。它提供了更高級別,更多 Pythonic 界面。具體而言,它將 DynamoDB 表公開為資源,並提供更簡單、更優雅的介面,相較於較低層級的服務導向用戶端介面。

由於這些專案是在託管 GitHub,因此您可以檢視原始程式碼、追蹤未解決的問題,或提交您自己的問題。

使用博托文檔

使用下列資源開始使用 Boto 文件:

  • 從快速入門部分開始,該部分為軟件包安裝提供了一個堅實的起點。如果尚未安裝 Boto3,請到那裡獲取有關安裝的說明(Boto3 通常在 AWS 服務中自動提供,例如)。 AWS Lambda

  • 之後,請專注於文件的 DynamoDB 指南。它說明如何執行基本 DynamoDB 活動:建立和刪除資料表、操作項目、執行批次作業、執行查詢以及執行掃描。其示例使用資接口。當你看到表boto3.resource('dynamodb')明你正在使用更高級別的資源接口。

  • 完成指南後,您可以檢閱 DynamoDB 參考資料。此登陸頁面提供您可用的類別和方法的詳盡清單。在頂部,你會看到DynamoDB.Client類。這提供了對所有控制面和數據平面操作的低級訪問。在底部,看看DynamoDB.ServiceResource班級。這是更高級別的 Pythonic 接口。有了它,您可以建立表格、跨表執行批次作業,或取得表格特定動作的DynamoDB.ServiceResource.Table執行個體。

了解客戶端和資源抽象層

您將使用的兩個介面是用戶端介面和資介面。

  • 低階用戶端介面提供與基礎服務 API 的 1 對 1 對 1 對應。DynamoDB 提供的每個 API 都可透過用戶端取得。這意味著客戶端界面可以提供完整的功能,但使用起來通常更加冗長和複雜。

  • 較高層級的資源介面不會提供基礎服務 API 的 1 對 1 對 1 對 1 對應。但是,它提供了使您更方便地訪問該服務的方法,例如batch_writer

以下是使用用戶端介面插入項目的範例。請注意如何將所有值作為映射傳遞,其鍵指示其類型('S' 表示字符串,'N' 表示數字)及其值作為字符串傳遞。這就是所 DynamoDB JSON 格式。

import boto3 dynamodb = boto3.client('dynamodb') dynamodb.put_item( TableName='YourTableName', Item={ 'pk': {'S': 'id#1'}, 'sk': {'S': 'cart#123'}, 'name': {'S': 'SomeName'}, 'inventory': {'N': '500'}, # ... more attributes ... } )

這是使用資源接口的相同PutItem操作。數據類型是隱含的:

import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('YourTableName') table.put_item( Item={ 'pk': 'id#1', 'sk': 'cart#123', 'name': 'SomeName', 'inventory': 500, # ... more attributes ... } )

如果需要,您可以使用 boto3 提供的和TypeDeserializer類別,在一般 JSON TypeSerializer 和 DynamoDB JSON 之間進行轉換:

def dynamo_to_python(dynamo_object: dict) -> dict: deserializer = TypeDeserializer() return { k: deserializer.deserialize(v) for k, v in dynamo_object.items() } def python_to_dynamo(python_object: dict) -> dict: serializer = TypeSerializer() return { k: serializer.serialize(v) for k, v in python_object.items() }

以下是如何使用客戶端界面執行查詢。它將查詢表示為 JSON 結構。它使用需要變量替換來處理任何潛在的關鍵KeyConditionExpression字衝突的字符串:

import boto3 client = boto3.client('dynamodb') # Construct the query response = client.query( TableName='YourTableName', KeyConditionExpression='pk = :pk_val AND begins_with(sk, :sk_val)', FilterExpression='#name = :name_val', ExpressionAttributeValues={ ':pk_val': {'S': 'id#1'}, ':sk_val': {'S': 'cart#'}, ':name_val': {'S': 'SomeName'}, }, ExpressionAttributeNames={ '#name': 'name', } )

使用資源接口的相同查詢操作可以縮短和簡化:

import boto3 from boto3.dynamodb.conditions import Key, Attr dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('YourTableName') response = table.query( KeyConditionExpression=Key('pk').eq('id#1') & Key('sk').begins_with('cart#'), FilterExpression=Attr('name').eq('SomeName') )

作為最後一個例子,假設你想要獲得一個表的近似大小(這是保存在表上的元數據,大約每 6 小時更新一次)。使用客戶端界面,您可以執行describe_table()操作並從返回的 JSON 結構中提取答案:

import boto3 dynamodb = boto3.client('dynamodb') response = dynamodb.describe_table(TableName='YourTableName') size = response['Table']['TableSizeBytes']

透過資源介面,表格會隱含地執行描述作業,並直接將資料顯示為屬性:

import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('YourTableName') size = table.table_size_bytes
注意

考慮是否要使用用戶端或資源介面進行開發時,請注意,不會依據資源說明文件將新功能新增至資源介面:「 AWS Python SDK 小組不打算將新功能新增至 boto3 中的資源介面。現有介面將在 boto3 的生命週期中繼續運作。客戶可以透過用戶端介面取得更新的服務功能。」

使用表格資源批次寫入器

只有更高層級的表格資源才能使用的便利之一是. batch_writer DynamoDB 支援批次寫入操作,允許在一個網路請求中執行多達 25 個置入或刪除操作。像這樣的批處理通過最大限度地減少網絡往返提高效率。

使用低階用戶端程式庫時,您可以使用此client.batch_write_item()作業執行批次。您必須手動將工作分割成 25 個批次。每次操作之後,您還必須請求接收未處理項目的列表(某些寫操作可能成功,而其他可能會失敗)。然後,您必須再次將這些未處理的項目傳遞到稍後的batch_write_item()操作中。沒有大量的樣板代碼。

表格 .batch_Writer 方法創建一個前後關聯管理器,用於在批處理中寫入對象。它提供了一個界面,看起來好像你一次寫一個項目,但在內部它正在緩衝並批量發送項目。它還隱含處理未處理的項目重試。

dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('YourTableName') movies = # long list of movies in {'pk': 'val', 'sk': 'val', etc} format with table.batch_writer() as writer: for movie in movies: writer.put_item(Item=movie)

探索客戶端和資源層的其他代碼示例

您也可以參考下列程式碼範例儲存庫,以探索使用用戶端和資源的各種函式的使用方式:

了解用戶端和資源物件如何與工作階段和執行緒互動

Resource 對象不是線程安全的,不應該跨線程或進程共享。有關更多詳細信息,請參閱資源指南

相比之下,Client 物件通常是執行緒安全的,除了特定的進階功能之外。如需詳細資訊,請參閱用戶端指南

會話對象不是線程安全的。因此,每次在多線程環境中創建客戶端或資源時,都應首先創建一個新的會話,然後從會話中創建客戶端或資源。如需詳細資訊,請參閱工作階段指南

當您呼叫時boto3.resource(),您隱含地使用預設工作階段。這對於編寫單線程代碼很方便。在編寫多線程代碼時,您需要首先為每個線程構建一個新的會話,然後從該會話中檢索資源:

# Explicitly create a new Session for this thread session = boto3.Session() dynamodb = session.resource('dynamodb')

自定義 Config 對象

當構造一個客戶端或資源對象,你可以傳遞可選的命名參數來自定義行為。名為的參數可config解鎖各種功能。這是一個實例botocore.client.ConfigConfig 的參考文檔顯示了它公開供您控制的所有內容。配置指南提供了一個很好的概述。

注意

您可以在工作階段層級、 AWS 組態檔案內或環境變數修改許多這些行為設定。

Config 逾時

自定義配置的一種用途是調整網絡行為:

  • connect_timeout (浮點數或整數) — 嘗試建立連線時擲回逾時例外狀況的秒數。預設值為 60 秒。

  • read_timeout (浮點數或整數) — 嘗試從連線讀取時擲回逾時例外狀況的秒數。預設值為 60 秒。

對於 DynamoDB 而言,60 秒的逾時時間過長。這意味著短暫的網絡故障將導致客戶端一分鐘的延遲,然後才能再試一次。下面的代碼將超時縮短到第二個:

import boto3 from botocore.config import Config my_config = Config( connect_timeout = 1.0, read_timeout = 1.0 ) dynamodb = boto3.resource('dynamodb', config=my_config)

如需有關逾時的詳細討論,請參閱針對延遲感知 DynamoDB 應用程式調整 AWS Java SDK HTTP 要求設定。請注意,Java SDK 具有比 Python 更多的超時配置。

保持活著的 Config

如果您使用的是 botocore 1.27.84 或更高版本,您還可以控制 TCP 保持活動狀態:

  • tcp_keepalive(布爾)-如果設置為(默認為),則在創建新連接時啟用 TCP 保持活動通訊端選項。True False這只能從肉毒核 1.27.84 開始使用。

將 TCP 保持活動狀態設置為True可以減少平均延遲。以下是示例代碼,當您擁有正確的 botocore 版本時,有條件地將 TCP 保持活動設置為 true:

import botocore import boto3 from botocore.config import Config from distutils.version import LooseVersion required_version = "1.27.84" current_version = botocore.__version__ my_config = Config( connect_timeout = 0.5, read_timeout = 0.5 ) if LooseVersion(current_version) > LooseVersion(required_version): my_config = my_config.merge(Config(tcp_keepalive = True)) dynamodb = boto3.resource('dynamodb', config=my_config)
注意

TCP 保持活動與 HTTP 保持活動狀態不同。使用 TCP Keep-Alive 時,基礎作業系統會透過通訊端連線傳送小型封包,以保持連線作用中,並立即偵測任何中斷。使用 HTTP 保持活動,基於底層套接字構建的 Web 連接被重用。HTTP 保持活動始終與肉毒 3 啟用。

閒置連接可以保持活躍的時間是有限的。如果您有閒置連接,但希望下一個請求使用已建立的連接,請考慮發送定期請求(例如每分鐘)。

重試 Config

該配置還接受一個名為 retries 的字典,您可以在其中指定所需的重試行為。當 SDK 收到錯誤且錯誤為暫時性類型時,會在 SDK 中重試。如果在內部重試錯誤(並且重試最終會產生成功的響應),則從調用代碼的角度看不到錯誤,只是稍微提高了延遲。以下是您可以指定的值:

  • max_ tries — 整數,代表將在單一要求上進行的重試嘗試次數上限。例如,將此值設為 2 將導致在初始請求之後最多重試兩次請求。將此值設為 0 將導致在初始請求之後不會嘗試重試。

  • total_max_ tries — 整數,代表將在單一要求上進行的總嘗試次數上限。這包括初始請求,因此值 1 表示不會重試任何請求。如果total_max_attempts和兩者max_attempts都提供,total_max_attempts優先。 total_max_attempts優先選擇,max_attempts因為它映射到AWS_MAX_ATTEMPTS環境變量和max_attempts配置文件值。

  • mode — 應使用代表重試模式類型的字符串。有效的 值如下:

    • 舊版 — 預設模式。在第一次重試時等待 50ms,然後使用基本因子為 2 的指數輪詢。對於 DynamoDB,它最多可執行總共 10 次嘗試次數 (除非使用上述內容覆寫)。

      注意

      使用指數輪詢時,最後一次嘗試將等待將近 13 秒。

    • 標準 — 命名為標準,因為它與其他 AWS SDK 更一致。等待從 0 毫秒到 1000 毫秒的隨機時間進行第一次重試。如果需要另一次重試,它會從 0ms 到 1,000ms 選擇另一個隨機時間,並將其乘以 2。如果需要額外的重試,它會執行相同的隨機選擇乘以 4,依此類推。每次等待時間上限為 20 秒。此模式會在偵測到的失敗情況下執行重試次數超過legacy模式。對於 DynamoDB,它最多可執行總共 3 次嘗試次數 (除非使用上述內容覆寫)。

    • adaptive-一種實驗重試模式,其中包括標準模式的所有功能,但增加了自動客戶端節流。使用自適應速率限制,SDK 可以減慢傳送要求的速率,以便更好地容納 AWS 服務的容量。這是一種臨時模式,其行為可能會改變。

您可以在重試指南以及 SDK 參考的「重試行為」主題中找到這些重試模式的擴充定義。

以下是一個明確使用legacy重試政策的示例,最多共有 3 個請求(2 次重試):

import boto3 from botocore.config import Config my_config = Config( connect_timeout = 1.0, read_timeout = 1.0, retries = { 'mode': 'legacy', 'total_max_attempts': 3 } ) dynamodb = boto3.resource('dynamodb', config=my_config)

由於 DynamoDB 是高可用性、低延遲的系統,因此您可能想要比內建重試原則允許的速度更積極。您可以通過將最大嘗試次數設置為 0,自己捕獲異常並根據自己的代碼重試,而不是依賴 boto3 進行隱式重試來實現自己的重試策略。

如果您管理自己的重試原則,則需要區分節流和錯誤:

  • 節流 (以ProvisionedThroughputExceededException或表示ThrottlingException) 表示運作良好的服務,通知您已超過 DynamoDB 資料表或分區上的讀取或寫入容量。每隔一毫秒,就會提供更多的讀取或寫入容量,因此您可以快速重試 (例如每 50 毫秒),以嘗試存取該新發佈的容量。使用節流時,您不需要特別需要指數輪詢,因為節流是輕量級的 DynamoDB 傳回,而且不會向您收取每個請求的費用。指數輪詢會將較長的延遲指派給已經等待最長時間的用戶端執行緒,從統計上將 p50 和 p99 向外延伸。

  • (由InternalServerError或 a 表示ServiceUnavailable,等等)表示服務發生暫時性問題。這可以是整個表格,也可能只是您正在讀取或寫入的分區。如果發生錯誤,您可以在重試(例如 250 毫秒或 500 毫秒)之前暫停更長的時間,並使用抖動來錯開重試。

最大池連接的 Config

最後,配置允許您控制連接池的大小:

  • 連線 (int) — 連線集區中要保留的最大連線數目。如果未設定此值,則會使用預設值 10。

此選項控制要保持集區以供重複使用的 HTTP 連線數目上限。每個工作階段會保留不同的池。如果您預期超過 10 個執行緒會針對用戶端或建立在相同工作階段的資源,您應該考慮提高這個問題,因此執行緒不必使用集區連線等待其他執行緒。

import boto3 from botocore.config import Config my_config = Config( max_pool_connections = 20 ) # Setup a single session holding up to 20 pooled connections session = boto3.Session(my_config) # Create up to 20 resources against that session for handing to threads # Notice the single-threaded access to the Session and each Resource resource1 = session.resource('dynamodb') resource2 = session.resource('dynamodb') # etc

錯誤處理

AWS 服務異常並非所有在 Boto3 中靜態定義。這是因為 AWS 服務的錯誤和例外情況差異很大,並且可能會發生變化。Boto3 會將所有服務例外狀況包裝為 a,ClientError並將詳細資訊公開為結構化 JSON。例如,錯誤回應的結構可能如下:

{ 'Error': { 'Code': 'SomeServiceException', 'Message': 'Details/context around the exception or error' }, 'ResponseMetadata': { 'RequestId': '1234567890ABCDEF', 'HostId': 'host ID data will appear here as a hash', 'HTTPStatusCode': 400, 'HTTPHeaders': {'header metadata key/values will appear here'}, 'RetryAttempts': 0 } }

下列程式碼會擷取任何ClientError例外狀況,並查看Code中的字串值,以決定Error要採取的動作:

import botocore import boto3 dynamodb = boto3.client('dynamodb') try: response = dynamodb.put_item(...) except botocore.exceptions.ClientError as err: print('Error Code: {}'.format(err.response['Error']['Code'])) print('Error Message: {}'.format(err.response['Error']['Message'])) print('Http Code: {}'.format(err.response['ResponseMetadata']['HTTPStatusCode'])) print('Request ID: {}'.format(err.response['ResponseMetadata']['RequestId'])) if err.response['Error']['Code'] in ('ProvisionedThroughputExceededException', 'ThrottlingException'): print("Received a throttle") elif err.response['Error']['Code'] == 'InternalServerError': print("Received a server error") else: raise err

某些(但不是全部)異常代碼已被實現為頂級類。您可以選擇直接處理這些問題。使用用戶端介面時,會在用戶端上動態填入這些例外狀況,並且您可以使用用戶端執行個體來 catch 取這些例外狀況,如下所示:

except ddb_client.exceptions.ProvisionedThroughputExceededException:

使用資源接口時,您必須使用從資源遍歷.meta.client到底層客戶端以訪問異常,如下所示:

except ddb_resource.meta.client.exceptions.ProvisionedThroughputExceededException:

若要複查具體化例外類型清單,您可以動態產生清單:

ddb = boto3.client("dynamodb") print([e for e in dir(ddb.exceptions) if e.endswith('Exception') or e.endswith('Error')])

使用條件運算式執行寫入作業時,您可以要求如果運算式失敗,應在錯誤回應中傳回項目的值。

try: response = table.put_item( Item=item, ConditionExpression='attribute_not_exists(pk)', ReturnValuesOnConditionCheckFailure='ALL_OLD' ) except table.meta.client.exceptions.ConditionalCheckFailedException as e: print('Item already exists:', e.response['Item'])

有關錯誤處理和異常的進一步閱讀:

日誌

boto3 庫與 Python 的內置日誌記錄模塊集成在一起,用於跟踪會話期間發生的情況。若要控制記錄層級,您可以設定記錄模組:

import logging logging.basicConfig(level=logging.INFO)

這將根記錄器配置為記錄INFO和高於級別的消息。記錄比級別不太嚴重的消息將被忽略。記錄層級包括DEBUGINFOWARNINGERROR、、和CRITICAL。預設值為 WARNING

在 boto3 記錄器是分層的。該庫使用了幾個不同的記錄器,每個記錄器都對應於庫的不同部分。您可以單獨控制每個行為:

  • boto3:boto3 模塊的主記錄器。

  • 肉毒核心:肉毒核軟件包的主記錄器。

  • botocore.auth:用於記錄 AWS 簽名創建請求。

  • botocore.credentials:用於記錄憑據獲取和刷新的過程。

  • botocore.endpoint:用於在通過網絡發送之前記錄請求創建。

  • botocore.hook:用於在庫中觸發的日誌事件。

  • botocore.loaders:用於加載服務模式的 AWS 部分時進行記錄。

  • botocore.parsers:用於在解析之前記錄服 AWS 務響應。

  • botocore.retryhandler:用於記錄 AWS 服務請求重試(傳統模式)的處理。

  • botocore.retries.standard:用於記錄 AWS 服務請求重試的處理(標準或自適應模式)。

  • botocore.utils:用於在圖書館記錄其他活動。

  • botocore.waiter:用於記錄服務員的功能,該服務輪詢 AWS 服務,直到達到特定狀態。

其他程式庫也會記錄。在內部,boto3 使用第三方網址 3 進行 HTTP 連接處理。當延遲很重要時,您可以通過查看 urllib3 何時建立新連接或關閉閒置連接來確保池正常利用。

  • urllib3. 連線池:用於記錄連線集區處理事件。

下列程式碼片段會INFO透過端點和連線集區活動的DEBUG記錄設定大部分記錄:

import logging logging.getLogger('boto3').setLevel(logging.INFO) logging.getLogger('botocore').setLevel(logging.INFO) logging.getLogger('botocore.endpoint').setLevel(logging.DEBUG) logging.getLogger('urllib3.connectionpool').setLevel(logging.DEBUG)

事件掛鉤

肉毒核在其執行的各個部分期間發出事件。您可以為這些事件註冊處理程序,以便無論何時發射事件,您的處理程序都會被調用。這使您可以擴展 botocore 的行為,而無需修改內部。

例如,假設您想要追蹤每次在應用程式中的任何 DynamoDB 表上呼叫PutItem作業時。您可以在'provide-client-params.dynamodb.PutItem'事件上註冊以 catch 和記錄每次在關聯的會話上調用PutItem操作時。範例如下:

import boto3 import botocore import logging def log_put_params(params, **kwargs): if 'TableName' in params and 'Item' in params: logging.info(f"PutItem on table {params['TableName']}: {params['Item']}") logging.basicConfig(level=logging.INFO) session = boto3.Session() event_system = session.events # Register our interest in hooking in when the parameters are provided to PutItem event_system.register('provide-client-params.dynamodb.PutItem', log_put_params) # Now, every time you use this session to put an item in DynamoDB, # it will log the table name and item data. dynamodb = session.resource('dynamodb') table = dynamodb.Table('YourTableName') table.put_item( Item={ 'pk': '123', 'sk': 'cart#123', 'item_data': 'YourItemData', # ... more attributes ... } )

在處理程序中,您甚至可以通過編程方式操作參數以更改行為:

params['TableName'] = "NewTableName"

如需有關事件的詳細資訊,請參閱有關事件的 botocore 文件和事件的 boto3 文件。

分頁和分頁器

某些要求 (例如「查詢和掃描」) 會限制單一要求傳回的資料大小,並要求您重複提出要求以提取後續頁面。

您可以使用參數控制每個頁面要讀取的最大項目limit數。例如,如果您想要最後 10 個項目,則可以使用僅擷limit取最後 10 個項目。請注意,限制是在套用任何篩選之前,應從表格中讀取多少。沒有辦法在過濾後指定你想要的 10; 你只能控制預先過濾的計數,並在你實際檢索到 10 時檢查客戶端。無論限制如何,每個響應始終具有 1 MB 的最大大小。

如果響應包含 aLastEvaluatedKey,則表示響應因為達到計數或大小限制而結束。該鍵是為響應評估的最後一個鍵。您可以檢索它LastEvaluatedKey並將其傳遞給後續調用,以ExclusiveStartKey便從該起點讀取下一個塊。如果沒有LastEvaluatedKey返回,則表示沒有更多符合「查詢」或「掃描」的項目。

下面是一個簡單的例子(使用 Resource 接口,但客戶端接口具有相同的模式),每頁最多讀取 100 個項目並循環,直到讀取所有項目。

import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('YourTableName') query_params = { 'KeyConditionExpression': Key('pk').eq('123') & Key('sk').gt(1000), 'Limit': 100 } while True: response = table.query(**query_params) # Process the items however you like for item in response['Items']: print(item) # No LastEvaluatedKey means no more items to retrieve if 'LastEvaluatedKey' not in response: break # If there are possibly more items, update the start key for the next page query_params['ExclusiveStartKey'] = response['LastEvaluatedKey']

為了方便起見,boto3 可以使用分頁器為您做到這一點。但是,它僅適用於客戶端界面。以下是重寫以使用分頁器的代碼:

import boto3 dynamodb = boto3.client('dynamodb') paginator = dynamodb.get_paginator('query') query_params = { 'TableName': 'YourTableName', 'KeyConditionExpression': 'pk = :pk_val AND sk > :sk_val', 'ExpressionAttributeValues': { ':pk_val': {'S': '123'}, ':sk_val': {'N': '1000'}, }, 'Limit': 100 } page_iterator = paginator.paginate(**query_params) for page in page_iterator: # Process the items however you like for item in page['Items']: print(item)

如需詳細資訊,請參閱分頁器指南和動態分頁器API 參考

注意

分頁器也有自己的組態設定MaxItems,名為StartingToken、和。PageSize若要使用 DynamoDB 進行分頁,您應該忽略這些設定。

等待程式

服務員提供了在繼續之前等待某些事情完成的能力。目前,它們僅支持等待創建或刪除表。在後台,服務員操作每 20 秒為您檢查一次,最多 25 次。您可以自己做,但是在編寫自動化時使用服務員很優雅。

此代碼顯示瞭如何等待特定表已創建:

# Create a table, wait until it exists, and print its ARN response = client.create_table(...) waiter = client.get_waiter('table_exists') waiter.wait(TableName='YourTableName') print('Table created:', response['TableDescription']['TableArn']

有關更多信息,請參閱服務員指南和服務員參考

下一個主題:

編程與 JavaScript

上一個主題:

低階 API
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。