DynamoDB GSI in Python (boto3) abfragen

Einen globalen Sekundärindex abzufragen ist ein normales query plus einem Parameter: IndexName. Die Schlüsselbedingung zielt dann auf die Schlüssel des Index, nicht der Tabelle — hier lässt uns AlbumTitle-index Songs nach Album abrufen, ein Zugriffsmuster, das die Basistabelle (Artist + SongTitle) ohne einen Scan nicht bedienen kann.

Code

import boto3

client = boto3.client("dynamodb")

paginator = client.get_paginator("query")

items = []
for page in paginator.paginate(
    TableName="Music",
    IndexName="AlbumTitle-index",
    KeyConditionExpression="#hashKey = :hashKeyValue",
    ExpressionAttributeNames={"#hashKey": "AlbumTitle"},
    ExpressionAttributeValues={":hashKeyValue": {"S": "Danzon"}},
):
    items.extend(page["Items"])

print(f"Found {len(items)} songs on the album")

Erklärung

  • IndexName — benennt den abzufragenden GSI (TableName ist weiterhin erforderlich). Die KeyConditionExpression nutzt den Partitions- (und optionalen Sortier-)Schlüssel des Index — hier AlbumTitle — mit denselben Operatoren wie eine Tabellenabfrage.
  • Nur letztendliche Konsistenz — GSIs replizieren asynchron von der Basistabelle. ConsistentRead=True bei einer GSI-Abfrage zu übergeben wertet sie nicht auf; sie löst eine ValidationException aus. (Local Secondary Indexes unterstützen starke Konsistenz.)
  • Du bekommst nur projizierte Attribute — eine GSI-Abfrage gibt zurück, was der Index projiziert (ALL, KEYS_ONLY oder die per INCLUDE gelisteten Attribute) und kann den Rest nicht aus der Basistabelle holen. Brauchst du ein nicht projiziertes Attribut? Setze mit get_item auf dem Tabellenschlüssel nach, oder erweitere die Projektion.
  • Schlüssel sind in einem GSI nicht eindeutig — viele Items können denselben Indexschlüssel teilen, und Items, denen das Indexschlüssel-Attribut fehlt, erscheinen einfach nicht (das ist das Sparse-Index-Muster).
  • Paginationclient.get_paginator("query") folgt LastEvaluatedKey über die Seiten genau wie bei einer Tabellenabfrage; jede page trägt eine Items-Liste.
  • Auf der Resource-API ist dieselbe Abfrage table.query(IndexName="AlbumTitle-index", KeyConditionExpression=Key("AlbumTitle").eq("Danzon")) mit nativen Python-Werten.

Visuell erledigen

Der DynamoDB Expression Builder baut die Schlüsselbedingung + Name-/Wert-Maps für Index-Abfragen und kopiert lauffähigen boto3-Code.

Um die Indizes einer Tabelle zu durchsuchen und GSI-Abfragen aus einem Formular auszuführen — paginiertes Raster, Copy-as-Code — lade DynoTable herunter.

Verwandte Beispiele

References

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Diesen Request visuell bauen

Stelle diese Operation im kostenlosen DynamoDB Query Builder zusammen — Key-Bedingung, Filter, Index, Limit, Sortierreihenfolge und eine Paginierungsschleife — und kopiere sie als lauffähiges SDK-v3-, CLI- oder boto3-Programm zurück.

DynamoDB Query Builder öffnen

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.