2016-11-02 6 views
2

thisチュートリアルに従っていて、Pythonを使用してテーブルを設定しましたが、golangではなくPythonでアイテムを取得できます。私は間違って何をしていますか?goantzがgoamz dynamodbで正しく動作するようにしました

私はこの(ほとんどコピーしてチュートリアルから貼り付ける)ように私のテーブルを作った:私は(Pythonで)このようなデータをロード

from __future__ import print_function # Python 2/3 compatibility 
import boto3 

dynamodb = boto3.resource('dynamodb', region_name='us-west-2') 

table = dynamodb.create_table(
    TableName='Movies', 
    KeySchema=[ 
     { 
      'AttributeName': 'year', 
      'KeyType': 'HASH' #Partition key 
     }, 
     { 
      'AttributeName': 'title', 
      'KeyType': 'RANGE' #Sort key 
     } 
    ], 
    AttributeDefinitions=[ 
     { 
      'AttributeName': 'year', 
      'AttributeType': 'N' 
     }, 
     { 
      'AttributeName': 'title', 
      'AttributeType': 'S' 
     }, 

    ], 
    ProvisionedThroughput={ 
     'ReadCapacityUnits': 10, 
     'WriteCapacityUnits': 10 
    } 
) 

my_item = {"year": 1999, "title": "MyMovie", "info": {"Plot": "DynamoDB"}} 
table.put_item(Item=my_item) 

とするとき、私はデータを読みます(Pythonで):

response = table.get_item(Key={"year":1999, 
         "title":"MyMovie", 
        } 
    ) 
print response 

私の出力は、次のとおりです。

{u'Item': {u'info': {u'Plot': u'DynamoDB'}, u'year': Decimal('1999'), u'title': u'MyMovie'}, 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'C8I2Q46K06T030INBCFN35RELVVV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPHeaders': {'x-amzn-requestid': 'C8I2Q46K06T030INBCFN35RELVVV4KQNSO5AEMVJF66Q9ASUAAJG', 'content-length': '93', 'server': 'Server', 'connection': 'keep-alive', 'x-amz-crc32': '4025342458', 'date': 'Wed, 02 Nov 2016 18:20:14 GMT', 'content-type': 'application/x-amz-json-1.0'}}} 

マイgolangコード:

package main 

import (
    "fmt" 
    "github.com/goamz/goamz/aws" 
    "github.com/goamz/goamz/dynamodb" 
) 


func main() { 

    access_key := "MyAccessKey" 
    secret_key := "MySecretKey" 

    auth := aws.Auth{AccessKey: access_key, SecretKey: secret_key} 

    server := &dynamodb.Server{Auth: auth, Region: aws.USWest2} 

    desc_ptr, err := server.DescribeTable("Movies") 

    if err != nil { 
     fmt.Println(err) 
    } 

    primary_key, err := desc_ptr.BuildPrimaryKey() 

    if err != nil { 
     fmt.Println(err) 
    } 

    table := server.NewTable("Movies", primary_key) 

    my_key := dynamodb.Key{HashKey: "1999", RangeKey: "MyMovie"} 

    result, err := table.GetItem(&my_key) 

    if err != nil { 
     fmt.Println(err) 
    } 

    fmt.Println("Printing Result") 

    for k, v := range(result) { 
     fmt.Println(k, *v) 
    } 
} 

結果で:

Printing Result 
title {S title MyMovie [] } 
year {N year 1999 [] } 

これは私が提供titleyear以外のすべてのものが欠落しています。私は何が欠けていますか?

編集:

マイgoバージョン:

go version go1.7.3 linux/amd64 

私は私が持っているものgoamzバージョン知りませんが、私は、マスターの先端にだということを非常に確信しています。

+0

コードは私のために正常に動作します。私は印刷結果の表に他の属性を表示します。 – notionquest

+0

@notionquest、ありがとうございます。私は確かに他の属性を取得していません。私はあなたと違うやり方をしているのだろう... – Akavall

+0

GOとgoamzのバージョンを分かち合うことができますか? – notionquest

答えて

1

これは、goamzライブラリのバグである可能性があります。関数parseAttributeには、異なるデータ型を解析するロジックがあります。しかし、MAP、LIST、BOOLなどのデータ型では機能していないようです。

私の見解では、String、Number、SSのデータ型は問題なく動作しています。 キー以外の文字列属性を追加してプログラムを実行できる場合は、結果の属性を取得する必要があります。

goamz item go source code for reference

+0

はい、そうです。私はその結果を得る。どうもありがとうございました。 – Akavall

1

、私が使用したコードをI(OP)は.. aws-sdk-go

を使用して終了、それが正常に動作します:

package main 

import (
    "fmt" 

    "github.com/aws/aws-sdk-go/aws" 
    "github.com/aws/aws-sdk-go/aws/endpoints" 
    "github.com/aws/aws-sdk-go/aws/session" 
    "github.com/aws/aws-sdk-go/service/dynamodb" 
) 

func main() { 

    sess := session.Must(session.NewSession(&aws.Config{ 
     Region: aws.String(endpoints.UsWest2RegionID), 
    })) 

    svc := dynamodb.New(sess) 

    input := &dynamodb.GetItemInput{ 
     Key: map[string]*dynamodb.AttributeValue{ 
      "year": { 
       N: aws.String("1999"), 
      }, 
      "title": { 
       S: aws.String("MyMovie"), 
      }, 
     }, 
     TableName: aws.String("Movies"), 
    } 

    result, err := svc.GetItem(input) 

    fmt.Println(result) 
    fmt.Println(err) 
} 
関連する問題