Maison > Article > développement back-end > Comment corriger l'erreur de requête Query Dynamodb ?
l'éditeur php Yuzai vous présente : Comment corriger l'erreur de requête Query dynamodb ? DynamoDB est un service de base de données NoSQL hautement évolutif fourni par Amazon. Lorsque vous utilisez DynamoDB pour les requêtes, vous pouvez rencontrer diverses erreurs qui affectent le fonctionnement normal du système. Pour corriger ces erreurs, vous devez d'abord vérifier soigneusement l'exactitude de l'instruction de requête et vous assurer que les paramètres fournis et la structure de la table correspondent. En outre, vous pouvez également améliorer les performances des requêtes en augmentant la capacité de lecture et en utilisant les index appropriés pour optimiser la vitesse des requêtes. De plus, comprendre et suivre les meilleures pratiques de DynamoDB, telles que l'utilisation rationnelle des opérations par lots et des expressions conditionnelles, peut également éviter efficacement les erreurs de requête. Grâce aux méthodes ci-dessus, vous pouvez facilement corriger et optimiser les erreurs dans les requêtes DynamoDB et améliorer la stabilité et les performances du système.
Dans dynamodb, j'ai un tableau qui contient :
- email (primary key) - password (attribute) - rname (attribute)
J'utilise aws go sdk v1 pour implémenter une requête en utilisant uniquement la clé primaire de la base de données :
La structure que je souhaite démobiliser est :
type item struct { email string `json:"email"` password string `json:"password"` rname string `json:"rname"` }
et 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 }
Cependant, je reçois un problème de clé invalide. Je vérifie la clé dans la base de données et elle correspond également à la clé que j'imprime sur la console.
Je ne sais pas comment résoudre ce problème, car les exemples que j'ai vus semblent fonctionner pour les leurs et se ressemblent.
Toute aide pour résoudre ce problème serait grandement appréciée :)
Vous devez définir la valeur du mot de passe et du nom sur omitempty
afin qu'elle ne soit pas définie sur null car ce ne sont pas des clés et elles ne doivent pas être incluses dans la requête, car elle renvoie une exception de clé non valide :
type item struct { email string `json:"email" dynamodbav:"email,omitempty"` password string `json:"password" dynamodbav:"password,omitempty"` rname string `json:"rname" dynamodbav:"rname,omitempty"` }
Je pense que le problème est dû au fait que vous essayez de rassembler l'intégralité de la réponse en une seule commande, cependant, l'itération fonctionne pour moi. (Je n'utilise pas go).
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() } }
De plus, lorsque vous utilisez email
的单个密钥时,这意味着最多有 1 个项目具有相同的电子邮件地址,这意味着您应该使用 getitem
而不是 query
:
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) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!