Heim > Backend-Entwicklung > Golang > Wie behebe ich den Abfragefehler bei der Dynamodb-Anfrage?

Wie behebe ich den Abfragefehler bei der Dynamodb-Anfrage?

WBOY
Freigeben: 2024-02-11 22:50:09
nach vorne
747 Leute haben es durchsucht

如何修复 Query dynamodb 请求的错误?

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.

Frageninhalt

In Dynamodb habe ich eine Tabelle, die Folgendes enthält:

- email (primary key)
- password (attribute)
- rname (attribute)
Nach dem Login kopieren

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"`
}
Nach dem Login kopieren

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
    }
Nach dem Login kopieren

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

Problemumgehung

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"`
}
Nach dem Login kopieren

Update

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&#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()
        
    }
}
Nach dem Login kopieren

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&#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)

}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage