Iniciante8 min de leitura

Como excluir vários itens em DynamoDB

Não há DELETE FROM table WHERE… em DynamoDB. Cada exclusão tem como alvo um item por sua chave primária completa - o API não tem operação de exclusão em massa, não truncar eA instrução DELETE remove exatamente um item por declaração. Portanto, "excluir vários itens" é sempre uma tarefa de duas etapas: encontre o chaves e emitir uma exclusão por chave, em lote para taxa de transferência.

Este guia aborda as opções de lote, a transação transacional do tipo tudo ou nada variante, o caso de excluir tudo e como fazer a mesma coisa com um seleção e duas teclas em uma GUI.

Como excluo vários itens em DynamoDB?

Colete as chaves primárias dos itens que você deseja eliminar (via Query ou Scan), em seguida, exclua-os em lotes: BatchWriteItem leva até 25 DeleteRequests por chamada, TransactWriteItems exclui até 100 itens atomicamente e PartiQL As instruções DELETE podem ser agrupadas em lote 25 por vez com BatchExecuteStatement. Em DynoTable você seleciona as linhas e pressiona ⌘⌫ para preparar as exclusões, revise e confirme.

Etapa 0: pegue as chaves

Uma exclusão precisa da chave primária inteira — em umtabela que é a chave de partição e a chave de classificação (AWS: "Para cada chave primária, você deve fornecer todos os atributos de chave"). Você não pode ser excluído por um atributo arbitrário, então "exclua todos os itens onde status = 'archived'" começa com uma leitura:

  • Se a condição reside em uma chave (ou uma chave GSI), um o Query direcionado coleta as chaves de maneira barata.
  • Caso contrário, é um Scan com um filtro — que lê (e fatura) o todo tabela, filtro ou não; consulte consulta vs varredura.

Use um ProjectionExpression que retorne apenas os atributos principais e siga LastEvaluatedKey até o final (pagination) ou você exclua silenciosamente apenas o valor da primeira página de 1 MB.

Método 1: BatchWriteItem (até 25 exclusões por chamada)

BatchWriteItem agrupa até 25 solicitações de colocação/exclusão ou 16 MB por chamada (referência AWS API: "Uma única chamada para BatchWriteItem pode transmitir até 16 MB de dados pelo rede, consistindo em até 25 operações de colocação ou exclusão de itens").

aws dynamodb batch-write-item --request-items '{
  "Orders": [
    {"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1001"}, "SK": {"S": "META"}}}},
    {"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1002"}, "SK": {"S": "META"}}}},
    {"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1003"}, "SK": {"S": "META"}}}}
  ]
}'

Três propriedades do grupo de pessoas - tudo direto do referência API:

  • Não atômico: "As operações PutItem e DeleteItem individuais especificados em BatchWriteItem são atômicos; entretanto BatchWriteItem como um todo não é." Algumas exclusões podem ocorrer, enquanto outras não.
  • Você deve tentar novamente UnprocessedItems. As solicitações limitadas retornam no Mapa de resposta UnprocessedItems, no mesmo formato da solicitação - "Normalmente, você chamaria BatchWriteItem em um loop" e AWS "fortemente recomendamos que você use um algoritmo de espera exponencial" entre novas tentativas.
  • Sem condições. "Você não pode especificar condições em opções de venda individuais e solicitações de exclusão" — uma exclusão condicional deve passar por DeleteItem ou um transação em vez disso. Um lote também rejeita duas operações na mesma chave em uma chamada.

O formato do loop - fragmentar por 25, enviar, reenfileirar as sobras com espera - é o mesmo abordado em operações em lote.

Método 2: TransactWriteItems (exclusões atômicas)

Quando um conjunto de exclusões deve ser bem-sucedido ou falhar juntos — removendo um pai item e seucrianças, digamos - use TransactWriteItems: até 100 ações (exclusões, colocações, atualizações, verificações de condições) aplicadas atomicamente, com por itempermitido. O comércio: uma transação custos de gravação o dobro da capacidade de gravação de uma gravação simples. A mecânica completa (tokens de idempotência, TransactionCanceledException, matemática de custo) estão em transações DynamoDB.

Método 3: PartiQL DELETE, em lote

PartiQL não elimina a regra por chave - apenas a reescreve. O desenvolvedor o guia é explícito (PartiQL DELETE): "Você só pode excluir um item por vez. Você não pode emitir um único DynamoDB Instrução PartiQL que exclui vários itens" e a condição WHERE "deve resolver para um único valor de chave primária".

Para excluir vários itens, você agrupa extratos de item único - BatchExecuteStatement executa até 25 instruções por lote (todas as leituras ou todas as gravações, nunca misturadas):

[
  {"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1001' AND SK = 'META'"},
  {"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1002' AND SK = 'META'"}
]
aws dynamodb batch-execute-statement --statements file://statements.json

Um WHERE que não fixa a chave completa falha - não há DELETE FROM Pedidos WHERE status = 'arquivado'. Mais padrões PartiQL (e o limites por trás deles) em exemplos PartiQL e PartiQL vs SQL.

Excluindo itens ALL (truncar)

DynamoDB não tem truncado. Suas opções, em ordem de preferência:

  1. Exclua e recrie a tabela. Exclusão item por item de uma tabela inteira fatura uma gravação por item; DeleteTable + CreateTable evita o escrever a fatura inteira. Configurações da tabela — índices, TTL,, modo de capacidade, tags – não volte por conta própria; você os declara novamente em criação (infraestrutura como código torna isso um não evento).
  2. Itens expiram com. Se "excluir tudo mais antigo que X" for realmente o que você deseja, TTL exclui itens expirados no segundo plano sem consumir capacidade de gravação — uma exclusão em massa em câmera lenta isso não custa nada.
  3. Scan + exclusão em lote (Método 1) quando a tabela deve permanecer ativa e apenas um subconjunto vai - você paga uma leitura por item digitalizado mais uma gravação por item excluído.

Exclua vários itens em DynoTable

O fluxo de seleção e exclusão acima — consultar, coletar chaves, fragmentar, tentar novamente — é exatamente o trabalho pesado que uma GUI deve possuir. Em DynoTable é uma grade seleção:

  1. Execute ou filtre uma consulta para que as linhas você quer ir embora estão na tela.
  2. Selecione-os e pressione ⌘⌫ — cada linha selecionada se torna um staged excluir. Nada tocou DynamoDB ainda: as linhas ficam vermelhas na grade e aparecem como cartões revisáveis no painel de teste.
  3. Revise e Comprometa-se. Os commits são enviados como lotes TransactWriteItems com condições de bloqueio otimista - uma exclusão gradual só será concluída se o item ainda existe — e grandes estágios são automaticamente fragmentados para permanecer dentro dos limites de transação de DynamoDB. ⌘⇧⌫ pula a revisão e exclui e confirma a seleção em um acorde.
Exclusões preparadas em DynoTable: linhas selecionadas tingidas de vermelho na grade, cada uma delas um cartão revisável no painel de teste antes do commit.
Exclusões preparadas em DynoTable: linhas selecionadas tingidas de vermelho na grade, cada uma delas um cartão revisável no painel de teste antes do commit.

Você exclui as linhas selecionadas — uma revisão, operação recuperável até a confirmação - não um truncamento cego de tabela completa. Para limpando uma tabela inteira, solte-a e recrie-a (acima).

Se uma exclusão precisar de uma condição escrita à mão (attribute_exists, uma versão verificar), construa os mapas ConditionExpression + espaço reservado exatos no DynamoDB Expression Builder e anexe-o para um DeleteItem ou transação.

FAQ

Posso excluir vários itens em uma chamada DynamoDB? Sim - até 25 com BatchWriteItem (melhor esforço, tente novamente UnprocessedItems) ou até 100 atomicamente com TransactWriteItems. Ambos fazem um primário completo chave por item; nenhum deles aceita uma condição "onde" para selecionar os itens.

Existe um DELETE WHERE em DynamoDB? Não. Nem o API de baixo nível nem o PartiQL podem excluir por condição - PartiQL's DELETE requer um WHERE que "resolva [s] para um único valor de chave primária". Você consulta ou procura as chaves primeiro e depois exclui cada uma delas.

Como excluo todos os itens de uma tabela DynamoDB? Para uma limpeza completa, exclua e recrie a tabela – isso evita pagar uma gravação por item. Para limpeza baseada em idade, use TTL, que exclui itens expirados sem consumir capacidade de gravação. Scan + exclusão em lote é o fallback quando a tabela deve permanecer ativa.

Por que os itens reaparecem após a exclusão do meu lote? Quase sempre UnprocessedItems não repetidos: um BatchWriteItem limitado retorna silenciosamente as exclusões com falha na resposta e o código que não faça um loop sobre eles "termina" com os itens ainda na tabela. Tente novamente com espera exponencial até que o mapa volte vazio.

Quanto custa a exclusão de itens? Cada exclusão é uma gravação padrão (um WCU por 1 KB, duplicado dentro de um transação) e encontrar as leituras dos custos das chaves também. Estime o dano com a calculadora de preços.

Prefere ver o que você está excluindo primeiro? Baixar DynoTable — selecione as linhas, prepare as exclusões com ⌘⌫, revise as diferenças e comprometa-se quando tiver certeza.

Atualizado