ホームページ バックエンド開発 Golang Go での AWS DynamoDB の使用: 完全ガイド

Go での AWS DynamoDB の使用: 完全ガイド

Jun 17, 2023 am 08:27 AM
言語を移動 aws dynamodb

はじめに:

現代のアプリケーションには、強力で信頼性が高く、スケーラブルで遅延の少ないデータベース ソリューションが必要です。データベースの選択には、パフォーマンス、価値、スケーラビリティなど、考慮すべき要素が数多くあります。 AWS DynamoDB は、インターネット規模のビッグデータ収集を処理するように設計されたフルマネージドの非リレーショナル データベースで、低レイテンシでスケーラブルなストレージと取得機能を提供します。この記事では、Go 言語での使用方法に焦点を当てて、AWS DynamoDB について詳しく説明します。

1. DynamoDB の概要

AWS DynamoDB は AWS クラウド サービスの一部であり、大規模なデータ収集をシームレスに処理できるフルマネージドの非リレーショナル データベースです。便利な API インターフェイス、オンデマンドで拡張できる低遅延、高スループット機能により、あらゆるアプリケーションで使用できます。他のデータベースプロバイダーに対する DynamoDB の最大の利点は、データの保存と読み取りの速度です。デフォルトのストレージ方式として SSD (ソリッド ステート ドライブ) を使用するため、読み取りと書き込みが非常に高速になります。

DynamoDB はシンプルなインターフェイスを備えており、Go 言語を含む Java、JavaScript、Python、Ruby などの多数のプログラミング言語とプラットフォームをサポートしています。 DynamoDB は、ドキュメント、Key-Value、グラフなどに基づく複数のデータ モデルを使用したデータ ストレージとクエリ操作をサポートします。 DynamoDB のデータ ストレージはテーブルの形式であり、各テーブルには複数のプロジェクトを含めることができ、各プロジェクトには複数の属性を含めることができます。

DynamoDB の使用は、AWS マネジメント コンソールまたは AWS SDK を使用して行うことができます。同時に、AWS SDK を実行するには、コードに独自の AWS アクセス認証情報を配置するか、安全でない環境変数を使用する必要があります。 。この書き方にはセキュリティ上のリスクがあり、チーム開発には不便です。したがって、よりエレガントで安全なソリューションを提供する AWS SDK for Go を使用して開発できます。

2. AWS SDK for Go を使用して DynamoDB に接続します

1. AWS SDK for Go をインストールします

ターミナルで次のコマンドを実行して、Go の AWS SDK をインストールします。 ##

$ go get -u github.com/aws/aws-sdk-go
ログイン後にコピー

2. AWS SDK for Go の設定

DynamoDB に接続する前に、AWS SDK for Go で使用される AWS アクセス キーとリージョンを設定する必要があります。これを行うには、次のコードをコードに追加します:

sess := session.Must(session.NewSession(&aws.Config{
    Region: aws.String("us-west-2"),
    Credentials: credentials.NewStaticCredentials(
        "YOUR_ACCESS_KEY_ID", "YOUR_SECRET_ACCESS_KEY", ""),
}))
ログイン後にコピー

Where リージョンと資格情報は必須のオプションです。 [リージョン] プロパティでは、AWS リージョンを指定できます。認証情報は、AWS サービスに接続するために使用される認証メカニズムです。 AWS アクセス証明書が割り当てられていない場合は、AWS 管理ページで新しい証明書を作成できます。

3. テーブルの作成と削除

DynamoDB では、テーブルは、データの保存と取得に使用できる同じ属性を持つアイテムのコレクションです。新しいテーブルを作成するには、テーブル名、主キー、容量単位などの属性を決定する必要があります。次のコードは、AWS SDK for Go を使用して DynamoDB テーブルを作成する方法を示しています。

svc := dynamodb.New(sess)

input := &dynamodb.CreateTableInput{
    AttributeDefinitions: []*dynamodb.AttributeDefinition{
        {
            AttributeName: aws.String("ID"),
            AttributeType: aws.String("N"),
        },
        {
            AttributeName: aws.String("Name"),
            AttributeType: aws.String("S"),
        },
    },
    KeySchema: []*dynamodb.KeySchemaElement{
        {
            AttributeName: aws.String("ID"),
            KeyType:       aws.String("HASH"),
        },
        {
            AttributeName: aws.String("Name"),
            KeyType:       aws.String("RANGE"),
        },
    },
    ProvisionedThroughput: &dynamodb.ProvisionedThroughput{
        ReadCapacityUnits:  aws.Int64(5),
        WriteCapacityUnits: aws.Int64(5),
    },
    TableName: aws.String("TableName"),
}
result, err := svc.CreateTable(input)
if err != nil {
    fmt.Println(err)
    return
}

fmt.Println(result)
ログイン後にコピー

作成が成功すると、新しく作成されたテーブルを DynamoDB コンソールで表示できます。テーブルを削除する場合は、次のコードを使用してください:

svc := dynamodb.New(sess)

input := &dynamodb.DeleteTableInput{
    TableName: aws.String("TableName"),
}

result, err := svc.DeleteTable(input)
if err != nil {
    fmt.Println(err)
    return
}

fmt.Println(result)
ログイン後にコピー

4. データの追加、読み取り、削除

1. データの追加

次のコードは、その方法を示しています。 AWS SDK for Go を使用するには、DynamoDB テーブルにデータを追加します:

svc := dynamodb.New(sess)

input := &dynamodb.PutItemInput{
    Item: map[string]*dynamodb.AttributeValue{
        "ID": {
            N: aws.String("123"),
        },
        "Name": {
            S: aws.String("John"),
        },
        "Age": {
            N: aws.String("29"),
        },
    },
    TableName: aws.String("TableName"),
}

_, err := svc.PutItem(input)
if err != nil {
    fmt.Println(err)
    return
}
ログイン後にコピー

PutItemInput インターフェイスでは、Item プロパティを使用してテーブルに追加する項目を指定し、TableName プロパティを使用してテーブルに追加する項目を指定します。テーブル名。

2. データの読み取り

次のコードは、AWS SDK for Go を使用して DynamoDB テーブルからデータを読み取る方法を示しています:

svc := dynamodb.New(sess)

input := &dynamodb.GetItemInput{
    Key: map[string]*dynamodb.AttributeValue{
        "ID": {
            N: aws.String("123"),
        },
        "Name": {
            S: aws.String("John"),
        },
    },
    TableName: aws.String("TableName"),
}

result, err := svc.GetItem(input)
if err != nil {
    fmt.Println(err)
    return
}

for key, value := range result.Item {
    fmt.Println(
        key,
        ":",
        value.S,
        value.N,
        value.BOOL,
    )
}
ログイン後にコピー

GetItemInput インターフェイスでは、Key 属性テーブルから取得する項目を指定するには、TableName プロパティを使用してテーブル名を指定します。取得したデータは返された結果のItemプロパティに格納され、ループを使用して取得したデータを走査して出力できます。

3. データの削除

次のコードは、AWS SDK for Go を使用して DynamoDB テーブル内のデータを削除する方法を示しています:

svc := dynamodb.New(sess)

input := &dynamodb.DeleteItemInput{
    Key: map[string]*dynamodb.AttributeValue{
        "ID": {
            N: aws.String("123"),
        },
        "Name": {
            S: aws.String("John"),
        },
    },
    TableName: aws.String("TableName"),
}

_, err := svc.DeleteItem(input)
if err != nil {
    fmt.Println(err)
    return
}
ログイン後にコピー

DeleteItemInput では、Key 属性が使用されます削除された項目については、TableName プロパティを使用してテーブル名を指定します。

5. 条件式の使用

AWS DynamoDB は非常に強力で、データのクエリ、更新、削除のための条件式の使用をサポートしています。条件式は、AND 演算子、OR 演算子、関係演算子、関数などの論理演算子を使用して条件を構築します。次のコードは、AWS SDK for Go を使用して、特定の条件に基づいて DynamoDB テーブル内のデータをクエリする方法を示しています:

svc := dynamodb.New(sess)

input := &dynamodb.QueryInput{
    KeyConditionExpression: aws.String("ID = :idval"),
    ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
        ":idval": {
            S: aws.String("123"),
        },
    },
    TableName: aws.String("TableName"),
}

result, err := svc.Query(input)
if err != nil {
    fmt.Println(err)
    return
}

for _, item := range result.Items {
    fmt.Println(item)
}
ログイン後にコピー

QueryInput インターフェイスでは、KeyConditionExpression を使用してクエリの条件を指定します。条件の値を指定するために使用されます。TableName 属性はテーブル名を指定します。

6. DynamoDB でのトランザクション制御の使用

AWS DynamoDB は、読み取り状態および書き込み状態のときにトランザクション論理ユニットの整合性を確保できるトランザクション制御機能を提供します。 DynamoDB トランザクションは次の特性を満たす必要があります:

    操作をアトミックに処理し、正常にコミットまたはロールバックする;
  1. トランザクションを実行する操作は同じテーブル内で完了する必要があります。
次のコードは、Go でトランザクションを使用する方法を示しています。

sess := session.Must(session.NewSessionWithOptions(session.Options{
    SharedConfigState: session.SharedConfigEnable,
}))

db := dynamodb.New(sess)

tableName := aws.String("product")

txOps := []*dynamodb.TransactWriteItem{
    {
        Delete: &dynamodb.Delete{
            TableName: aws.String(*tableName),
            Key: map[string]*dynamodb.AttributeValue{
                "product_id": {N: aws.String("1")},
            },
        },
    },
}

txCtxt := &dynamodb.TransactWriteItemsInput{
    TransactItems: txOps,
}

result, err := db.TransactWriteItems(txCtxt)
if err != nil {
    fmt.Println("failed to delete product 1")
    return
}

fmt.Println(result)
ログイン後にコピー

上記のコードでは、最初に DynamoDB クライアントを作成し、処理するテーブルを指定します。次に、キー「1」の商品データ レコードを削除するトランザクション操作が定義されます。最後に、DynamoDB トランザクション コンテキスト オブジェクトを定義し、実行するトランザクション操作を TransactWriteItems メソッドに渡します。

7. DynamoDB を使用して条件付きでデータを更新する

条件更新是将新值写回项目时使用的一种机制。当特定条件被给定时,更新操作将执行。要使用条件更新,必须满足以下条件:

  1. 更新目标必须存在;
  2. 更新操作必须基于某个条件执行。

下面是一个条件更新的示例:

updateInput := &dynamodb.UpdateItemInput{
    TableName: aws.String("product"),
    Key: map[string]*dynamodb.AttributeValue{
        "product_id": {N: aws.String("2")},
    },
    UpdateExpression: aws.String("set productName = :n"),
    ConditionExpression: aws.String("attribute_exists(product_id)"),
    ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
        ":n": {S: aws.String("product_name_new")},
    },
}

_, err = db.UpdateItem(updateInput)
if err != nil {
    fmt.Println(err)
    return
}
ログイン後にコピー

上述示例是使用条件更新更新了产品ID为“2”的产品名称。在条件表达式中,我们使用了attribute_exists函数来检查该项目是否存在。

八、总结

在本文中,我们深入介绍了 DynamoDB 及其在Go语言中的使用方法。我们讨论了配置 AWS SDK for Go,创建和删除表,添加、读取和删除数据,使用条件表达式,事务控制以及条件更新数据。由于 DynamoDB 具有可伸缩性、高可用性和良好的性能,因此可以成为处理大规模数据集合的首选数据库解决方案之一。

如果您想开始使用 AWS DynamoDB 和 Go,强烈建议您参考 AWS 官方文档 以便获得更详细的信息和 API 示例。

以上がGo での AWS DynamoDB の使用: 完全ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

言語スライスに行く:シングルエレメントスライスインデックス1インターセプトの場合、なぜエラーを報告しないのですか? 言語スライスに行く:シングルエレメントスライスインデックス1インターセプトの場合、なぜエラーを報告しないのですか? Apr 02, 2025 pm 02:24 PM

Go Language Slice Index:エラーなしでインデックス1からシングルエレメントスライスインターセプトがインターセプトされるのはなぜですか? GO言語では、スライスは底部を参照できる柔軟なデータ構造です...

GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? Apr 02, 2025 pm 04:09 PM

GOのマップイテレーションにより、すべての値が最後の要素になるのはなぜですか? Go言語では、いくつかのインタビューの質問に直面したとき、あなたはしばしば地図に遭遇します...

See all articles