Go - Chancho - 2によるダイナモ


今日、我々はあなたがダイナモと想像できる最も簡単なことをするつもりです.まず何かを入れて、それを取り出します.それはあまりにも簡単で、読む価値がないようですが、しばらくの間私と耐えてください.
シリーズの最初のエピソードでは、我々は正常に我々はDynamoDBと遊ぶつもりです環境を作成しました.あなたはこのエピソードのコードを見つけることができますepisode2 ディレクトリ.

データベースレイアウト
環境に行く準備ができて我々は問題解決を開始することができます.今日の私たちの問題は、順序に関する基本的な情報を保存して取得することです.orderには3つのプロパティがあります.
  • id - 文字列
  • price - 数
  • is_shipped - ブーリアン
  • データベースレイアウトを定義するために、私はCloudFormationを使用しています- AWSインフラストラクチャのためのアセンブリ言語.AWS CLIまたはAWSコンソールを使用して、異なるチャネルを介してDynamoDBテーブルを作成できます.私は、AWS曇り形成を選びました
    Serverless Application Model(Sam)またはServerless Frameworkを使用してサーバーレスアプリケーションで動作する場合は、どのようにしてテーブルを定義するかがわかります.
    見てみましょう.
    AWSTemplateFormatVersion: "2010-09-09"
    Resources:
      OrdersTable:
        Type: AWS::DynamoDB::Table
        Properties:
          AttributeDefinitions:
            - AttributeName: id
              AttributeType: S
          KeySchema:
            - AttributeName: id
              KeyType: HASH
          BillingMode: PAY_PER_REQUEST
          TableName: OrdersTable
    
    
    まず最初に、テーブルはOrderstableと呼ばれます.次に、属性定義に注目しましょう.DynamoDBの属性は、項目内に格納されるフィールドまたはプロパティです.テンプレートでid 型文字列の属性.
    項目はキーによって一意に識別されます.キーid はハッシュキーで、パーティションキーとも呼ばれます.私はこの時点でキーの種類に飛び込むことはありません.今のところ、ハッシュキーは一意にDynamODBテーブルの項目を識別します.

    なぜprice and is_shipped 属性が定義されていません.
    DynamoDBでは、キーの一部である属性のみを定義する必要があります.これはNOSQL世界です、そして、我々はアイテムの各々とすべての属性を指定する必要はありません.

    いくつかのコードを既に見ましょう!
    そこに行く.これが注文定義です.通知dynamodbav struct tag指定した構造体フィールドをシリアル化する方法を指定します.ところで、DynamicBavのAVは属性値を表します.
    type Order struct {
      ID           string    `dynamodbav:"id"`
      Price        int       `dynamodbav:"price"`
      IsShipped    bool      `dynamodbav:"is_shipped"`
    }
    
    ダイナモ接続接続の設定から始めましょう.
    func TestPutGet(t *testing.T) {
      ctx := context.Background()
      tableName := "OrdersTable"
      db, cleanup := dynamo.SetupTable(t, ctx, tableName, "./template.yml")
      defer cleanup()
    
    呼び出しを延期することに注意してくださいcleanup 関数.このメソッドは、SetupTable .
    ここで、DynamoDBに挿入する前にデータを準備する必要があります.
    order := Order{ID: "12-34", Price: 22, IsShipped: false}
    avs, err := dynamodbattribute.MarshalMap(order)
    assert.NoError(t, err)
    
    ありがとうdynamodbav 構造体タグOrder , MarshalMap 関数は、構造体をDynamodbが理解する構造体にマーシャリングする方法を知っている.最後にDBに挿入する準備ができました.
    _, err = db.PutItemWithContext(ctx, &dynamodb.PutItemInput{
        TableName: aws.String(table),
        Item:      avs,
    })
    assert.NoError(t, err)
    
    新しい項目を作成したり、古いキーを同じキーで置き換えるDynamoDB putitem操作を使用しています.最初のパラメータはcontext を使用します.AWSへのすべての呼び出しのために、SDKはあなたに2つの機能を与えます.離れてPutItemWithContext , またPutItem 関数.私がこれが生産でものをする方法であると感じるので、私は各々の呼び出しで文脈を使います、そして、それはSDKで働くとき、あなたのデフォルト選択でなければなりません.2番目の引数はdynamodb.PutItemInput . SDKがサポートするAWSへのすべての呼び出しに対して、このパターンを期待することができます.
  • APICallWithContext - 呼び出す関数
  • APICallInput - 関数の引数
  • APICallOutput - 関数の戻り値
  • 気づくべき一つはtable を呼び出すaws.String 関数.これは多くの場所でSDKがタイプを受け入れるからですpointer to type 代わりにtype そして、このラッパーはその転換を作ります.
    SDK呼び出しからの最初の戻り値が無視されていることに注意してください.我々は、本当にそれをここで必要としません.我々がこの点で知りたいことだけは、我々がどんなエラーも得なかったということです.

    DynamoDBから順番を得る
    out, err := db.GetItemWithContext(ctx, &dynamodb.GetItemInput{
      Key: map[string]*dynamodb.AttributeValue{
        "id": {
          S: aws.String("12-34"),
        },
      },
      TableName: aws.String(table),
    })
    assert.NoError(t, err)
    
    ここの多くの部分は、同様です.があるAPICallWithContext , and APICallInput パターンIにマッチする要素は、前にあなたを示しました.TableName 入力のパラメータはまったく同じです.
    我々はアイテムを取得したいので、キーを提供する必要があります.これはSDKの面倒を見る場所です.キーを構築するのは少しオフに見えるが、それは何です.キーがここにあるものより複雑でありえるので、それは地図です.どのように定義idtemplate.yml ? S字型の「S」.私たちは、DynamoDBと話すとき、キーでそれを指定する必要があります.
    実行する必要がある最後のステップは、DynamoDBから得たものを何かに対して逆シリアル化していることです.
    var queried Order
    err = dynamodbattribute.UnmarshalMap(out.Item, &queried)
    assert.NoError(t, err)
    assert.Equal(t, Order{ID: "12-34", Price: 22, IsShipped: false}, queried)
    

    概要
    今日行ったことを要約しましょう
  • データベースレイアウトを定義しました.
  • 私たちはStructをDynamoDB項目にマーシャリングしました.
  • 私たちはアイテムをダイナモに入れました.
  • 我々はダイナモからアイテムを得た.
  • 私たちはアイテムをstructに戻しました.
  • クローンを確認してくださいrepository そして、コードで遊ぶ.このエピソードに関連するコードはepisode2 倉庫のディレクトリ.