Maison  >  Article  >  développement back-end  >  Comment corriger l'erreur de requête Query Dynamodb ?

Comment corriger l'erreur de requête Query Dynamodb ?

WBOY
WBOYavant
2024-02-11 22:50:09709parcourir

如何修复 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.

Contenu de la question

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 :)

Solution de contournement

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"`
}

Mise à jour

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&#160;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&#160;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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer