Heim > Artikel > Backend-Entwicklung > Wie behebe ich den Abfragefehler bei der Dynamodb-Anfrage?
php-Editor Yuzai präsentiert Ihnen: Wie behebe ich den Abfrage-Dynamodb-Anforderungsfehler? DynamoDB ist ein hoch skalierbarer NoSQL-Datenbankdienst von Amazon. Wenn Sie DynamoDB zum Abfragen verwenden, können verschiedene Fehler auftreten, die den normalen Betrieb des Systems beeinträchtigen. Um diese Fehler zu beheben, müssen Sie zunächst sorgfältig die Richtigkeit der Abfrageanweisung prüfen und sicherstellen, dass die bereitgestellten Parameter und die Tabellenstruktur übereinstimmen. Darüber hinaus können Sie die Abfrageleistung verbessern, indem Sie die Lesekapazität erhöhen und geeignete Indizes verwenden, um die Abfragegeschwindigkeit zu optimieren. Darüber hinaus können Abfragefehler wirksam vermieden werden, wenn Sie die Best Practices von DynamoDB verstehen und befolgen, z. B. die rationelle Verwendung von Stapeloperationen und bedingten Ausdrücken. Mit den oben genannten Methoden können Sie Fehler in DynamoDB-Abfragen einfach beheben und optimieren sowie die Systemstabilität und -leistung verbessern.
In Dynamodb habe ich eine Tabelle, die Folgendes enthält:
- email (primary key) - password (attribute) - rname (attribute)
Ich verwende aws go sdk v1, um die Abfrage nur mit dem Datenbank-Primärschlüssel zu implementieren:
Die Struktur, die ich aufheben möchte, ist:
type item struct { email string `json:"email"` password string `json:"password"` rname string `json:"rname"` }
und Code:
result, err := client.Query(&dynamodb.QueryInput{ TableName: aws.String("accountsTable"), KeyConditions: map[string]*dynamodb.Condition{ "email": { ComparisonOperator: aws.String("EQ"), AttributeValueList: []*dynamodb.AttributeValue{ { S: aws.String(email), }, }, }, }, }) if err != nil { return false, err } item := []Item{} err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &item) if err != nil { return false, err }
Allerdings erhalte ich ein Problem mit einem ungültigen Schlüssel. Ich überprüfe den Schlüssel in der Datenbank und er stimmt auch mit dem Schlüssel überein, den ich auf der Konsole ausdrucke.
Ich bin mir nicht sicher, wie ich das beheben kann, da die Beispiele, die ich gesehen habe, bei ihnen zu funktionieren scheinen und gleich aussehen.
Jede Hilfe zur Lösung dieses Problems wäre sehr dankbar :)
Sie müssen den Wert von Passwort und Rname auf omitempty
setzen, damit er nicht auf Null gesetzt wird, da es sich nicht um Schlüssel handelt und sie nicht darin enthalten sein sollten die Abfrage, da sie eine ungültige Schlüsselausnahme auslöst:
type item struct { email string `json:"email" dynamodbav:"email,omitempty"` password string `json:"password" dynamodbav:"password,omitempty"` rname string `json:"rname" dynamodbav:"rname,omitempty"` }
Ich denke, das Problem liegt daran, dass Sie versuchen, die gesamte Antwort in einem einzigen Befehl zusammenzufassen. Bei mir funktioniert die Iteration jedoch. (Ich benutze go nicht).
package main import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/dynamodb" "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute" "fmt" ) func main() { // create session sess := session.must(session.newsessionwithoptions(session.options{ sharedconfigstate: session.sharedconfigenable, })) // create dynamodb client with logging client := dynamodb.new(sess, aws.newconfig()) type item struct { email string `dynamodbav: "email"` password string `dynamodbav: "password,omitempty"` rname string `dynamodbav: "rname,omitempty"` } result, err := client.query(&dynamodb.queryinput{ tablename: aws.string("accountstable"), keyconditions: map[string]*dynamodb.condition{ "email": { comparisonoperator: aws.string("eq"), attributevaluelist: []*dynamodb.attributevalue{ { s: aws.string("<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="aec2c6c0c0c9eecfc3cfd4c1c080cdc1c3">[email protected]</a>"), }, }, }, }, }) if err != nil { fmt.println("query api call failed:") fmt.println((err.error())) } for _, i := range result.items { item := item{} err = dynamodbattribute.unmarshalmap(i, &item) if err != nil { fmt.println("got error unmarshalling: %s", err) } fmt.println("email: ", item.email) fmt.println() } }
Außerdem, wenn Sie email
的单个密钥时,这意味着最多有 1 个项目具有相同的电子邮件地址,这意味着您应该使用 getitem
而不是 query
verwenden:
package main import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/dynamodb" "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute" ) func main() { // Item to Get type Item struct { Email string `dynamodbav: "email"` Password string `dynamodbav: "password,omitempty"` Rname string `dynamodbav: "rname,omitempty"` } // Create Session sess := session.Must(session.NewSessionWithOptions(session.Options{ SharedConfigState: session.SharedConfigEnable, })) // Create DynamoDB Client client := dynamodb.New(sess, aws.NewConfig()) // Get Item result, err := client.GetItem(&dynamodb.GetItemInput{ TableName: aws.String("accountsTable"), Key: map[string]*dynamodb.AttributeValue{ "email": { S: aws.String("<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="4a262224242d0a2b272b30252464292527">[email protected]</a>"), }, }, }) // Catch Error if err != nil { fmt.Println("GetItem API call failed:") fmt.Println((err.Error())) } item := Item{} // Unmarhsall err = dynamodbattribute.UnmarshalMap(result.Item, &item) if err != nil { panic(fmt.Sprintf("Failed to unmarshal Record, %v", err)) } // If Item Returns Empty if item.Email == "" { fmt.Println("Could not find Item") return } // Print Result fmt.Println("Found item:") fmt.Println("Email: ", item.Email) }
Das obige ist der detaillierte Inhalt vonWie behebe ich den Abfragefehler bei der Dynamodb-Anfrage?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!