2016-05-05 19 views
8

Se ho una tabella con una chiave hash di userId e una chiave di intervallo di productId come posso inserire un elemento in quella tabella solo se non esiste già usando i binding dynamodb di boto3?Come inserire un elemento in una tabella dinamodb con condizionamento usando boto3

La chiamata normale put_item assomiglia a questo

table.put_item(Item={'userId': 1, 'productId': 2}) 

mia chiamata con un ConditionExpression assomiglia a questo:

table.put_item(
    Item={'userId': 1, 'productId': 2}, 
    ConditionExpression='userId <> :uid AND productId <> :pid', 
    ExpressionAttributeValues={':uid': 1, ':pid': 3} 
) 

Ma questo solleva un ConditionalCheckFailedException ogni volta. Se un articolo esiste con lo stesso productId o no.

risposta

22

La documentazione per questa, purtroppo, non è libero eccellente. Avevo bisogno di realizzare qualcosa di simile, ed ecco cosa ha funzionato per me, utilizzando boto3:

try: 
    table.put_item(
     Item={ 
      'foo':1, 
      'bar':2, 
     }, 
     ConditionExpression='attribute_not_exists(foo) AND attribute_not_exists(bar)' 
    ) 
except botocore.exceptions.ClientError as e: 
    # Ignore the ConditionalCheckFailedException, bubble up 
    # other exceptions. 
    if e.response['Error']['Code'] != 'ConditionalCheckFailedException': 
     raise 

Simile al altra risposta, la chiave è nella funzione attribute_not_exists, ma non era chiaro per me inizialmente come ottenere che a lavoro. Dopo alcuni esperimenti, sono stato in grado di farlo funzionare con quanto sopra.

1

Penso che si otterrà una migliore documentazione utilizzando client.put_item piuttosto che table.put_item

da boto3 documentation:

Per evitare un nuovo elemento di sostituire un elemento esistente, utilizzare un'espressione condizionale che contiene la funzione attribute_not_exists con il nome dell'attributo utilizzato come chiave di partizione per la tabella. Poiché ogni record deve contenere quell'attributo, la funzione attribute_not_exists avrà esito positivo solo se non esiste alcun elemento corrispondente.

ConditionExpression:

ConditionExpression (stringa) - Una condizione che deve essere soddisfatta in ordine per un'operazione PutItem condizionale per avere successo.

Un'espressione può contenere uno qualsiasi dei seguenti:

Funzioni: attribute_exists | attribute_not_exists | attribute_type | contiene | starts_with | dimensione Questi nomi di funzioni fanno distinzione tra maiuscole e minuscole.

sto usando dynamodb2 overwrite parameter su item.save()

+0

Bene ... Ho letto la documentazione. Ma ho trovato che scrivere un'espressione condizionale non è intuitivo e sono preoccupato che il modo in cui l'ho scritto non stia facendo quello che penso stia facendo. Quindi mi stavo chiedendo se qualcun altro lo avesse già fatto prima. Hai un esempio di come l'hai fatto? Aggiornerò la mia risposta mostrando come l'ho fatto – aychedee

+0

ho aggiunto alla risposta come lo faccio .. (usando sovrascrittura) –

+0

Ah okay ... che sta usando boto. Sto chiedendo di boto3. Ma grazie per aver dedicato del tempo per dare un'occhiata. – aychedee

Problemi correlati