2016-08-26 17 views
0

UpdateExpression構文のために失敗し、次のように私のPythonコードでは、私はリソースが初期化されています:/DynamoDBの中のアイテムを更新すると、私はDynamoDBのテーブルを作成しました

self.dynamodb = self.session.resource('dynamodb').Table('aws-ci') 

テーブルが持つただ一つのインデックス/キーの名前はenvironmentです。

{ 
    "environment": "beta", 
    "X": { 
    "current_sha": "sha1", 
    "deployed": true, 
    "prev_sha": "sha2", 
    "status": "inactive" 
    }, 
    "Y-Z": { 
    "current_sha": "sha1", 
    "deployed": false, 
    "prev_sha": "sha2", 
    "status": "active" 
    } 
} 

XY-Zはマイクロサービスの名称です:次のように私は、それにPUTにオブジェクトをしようとしています。次のように私の挿入コードは次のとおりです。

def put_service_data(self, environment, service_name, service_data, status = None): 
    get_previous = self.dynamodb.get_item(
     Key = { 
      'environment': environment 
     } 
    ).get(service_name) 
    service_data['prev'] = get_previous and get_previous.get('current_sha') or 'NULL' 
    if status == 'rollback' and get_previous: 
     service_data['current'] = get_previous.get('current_sha') 
     service_data['prev'] = get_previous.get('prev_sha') 
    set_query = "SET {0}.current_sha = :current, {0}.prev_sha = :prev, {0}.deployed = :is_deployed, {0}.current_status = :status".format(service_name) 
    updated = self.dynamodb.update_item(
     Key = { 
      'environment': environment 
     }, 
     UpdateExpression = set_query, 
     ExpressionAttributeValues = { 
      ':current': service_data.get('current'), 
      ':prev': service_data.get('prev'), 
      ':status': service_data.get('status'), 
      ':is_deployed': service_data.get('deployed') 
     }, 
     ReturnValues = "ALL_NEW" 
    ) 
    return updated 

以前は、代わりに{0}.current_statusの、私は{0}.statusを持っていたが、それは次のエラー提起:とにかく

An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression : Attribute name is a reserved keyword; reserved keyword: status

を、私はcurrent_statusと試みたにその属性名の名前を変更しましたもう一度挿入します。

An error occurred (ValidationException) when calling the UpdateItem operation: The document path provided in the update expression is invalid for update

サービスの属性を設定しようとすると、X 、およびY-Zのためにしようとするときは、次の

An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression : Syntax error; token: "-", near: "Y-Z"

私はupdate_itemコールがどのように動作するかを理解することが現在できませんよ。

答えて

3

これを試しましたか? http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames

set_query = "SET #service_name.current_sha = :current, #service_name.prev_sha = :prev, #service_name.deployed = :is_deployed, #service_name.current_status = :current_status" 
updated = self.dynamodb.update_item(
    Key = { 
     'environment': environment 
    }, 
    UpdateExpression = set_query, 
    ExpressionAttributeValues = { 
     ':current': service_data.get('current'), 
     ':prev': service_data.get('prev'), 
     ':current_status': service_data.get('status'), 
     ':is_deployed': service_data.get('deployed') 
    }, 
    ExpressionAttributeNames = { 
     '#service_name': service_name, 
    }, 
    ReturnValues = "ALL_NEW" 
) 
+0

そうです。 :/私はどのように私はドキュメントでそのパラメータを見逃しているのかわかりません。 – hjpotter92

+0

'current_status'を' status'に戻しても動作しますか? – hjpotter92

+0

これを行うと、ExpressionAttributeNamesにステータスを追加する必要があります –

関連する問題