![](/img/trans.png)
[英]DynamoDB ConditionExpression without using ExpressionAttributeValues
[英]How to set `ConditionExpression` for `dynamodb.UpdateItemInput ` using dynamodbiface.expression
expr := expression.Name("field1").Equal(expression.Value("val1"))
condition, err := expression.NewBuilder().WithCondition(expr).Build()
if err != nil { return err }
updateExpr := expression.Set(expression.Name("field2"), expression.Value("field2"))
update, err := expression.NewBuilder().WithUpdate(updateExpr).Build()
updateItemInput := &dynamodb.UpdateItemInput {
TableName : aws.String("foobar"),
Key: partitionKey,
ConditionExpression: condition.Condition(),
UpdateExpression: update.Update(),
ExpressionAttributeNames: update.Names(),
ExpressionAttributeValues: update.Values(),
ReturnValues: aws.String("UPDATED_NEW"),
}
以上是updateItemInput
現在的樣子。 我試圖通過這個實現的是:
if field1 == "value1" then
set field2 = "value2"
不用說,這失敗了,因為ExpressionAttributeNames
和ExpressionAttributeValues
沒有condition
的上下文。
我在網上和 StackOverflow 上看到的是,人們大多自己編寫ConditionExpression
字符串,我希望盡可能避免這種情況。
那么有什么方法可以使用dynamodbiface.expression
來避免手動編寫ConditionExpression
?
您只需要一個表達式,然后根據要填充的輸入值使用適當的方法:
ex, e := expression.NewBuilder().
WithCondition(expression.Name("field1").Equal(expression.Value("val1"))).
WithUpdate(expression.
Set(
expression.Name("field2"),
expression.Value("value2")).
Build()
if e != nil {
return e
}
updateItemInput := &dynamodb.UpdateItemInput{
TableName: aws.String("foobar"),
Key: partitionKey,
ConditionExpression: ex.Condition(),
ExpressionAttributeNames: ex.Names(),
ExpressionAttributeValues: ex.Values(),
UpdateExpression: ex.Update(),
ReturnValues: aws.String("UPDATED_NEW"),
}
這是我在生產中工作的一些東西的稍微修改版本。 我無法確認ReturnValues
有效,因為我不使用它,但其余部分幾乎是從工作代碼中復制/粘貼的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.