Package: dynolayer
DynoLayerODynoLayeré uma ferramenta poderosa que simplifica e agiliza o acesso e manipulação de dados no Amazon DynamoDB. Baseada no padrão Active Record, esta biblioteca oferece uma abstração intuitiva para interagir com tabelas no DynamoDB, permitindo operações de CRUD (Create, Read, Update, Delete) de forma fácil e natural.InstalaçãoPara usar o pacote basta instalar através do gerenciador de dependências de sua preferência.pipinstalldynolayeroupipenvinstalldynolayerExemplosPara mais exemplos, consulte a pastadocsPara iniciar, primeiro você precisa criar a sua model herdando a classeDynoLayer. O nome da tabela e os atributos obrigatórios são os únicos campos requeridos, os demais já possuem um valor padrão.fromdynolayerimportDynoLayerclassUser(DynoLayer):def__init__(self)->None:super().__init__('users',[])Por padrão, o timezone utilizado é oAmerica/Sao_Paulo. Para alterar isso basta adicionar a variável de ambienteTIMESTAMP_TIMEZONEcom o valor desejado.TIMESTAMP_TIMEZONE='US/Eastern'O mesmo se aplica para a região e para o uso local do dynamodb. Caso as variáveis abaixo não existam, os valores padrão serãosa-east-1e o dynamodb da da aws na região utilizada.REGION='us-east-1'LOCAL_ENDPOINT='http://localhost:8000'SavePara criar um registro, é preciso instanciar a model e atribuir valor as suas propriedades. Depois basta rodar umsave()para salvar no banco!user=User()user.full_name='John Doe'user.email='john@mail.com'user.stars=5user.phones=['11 91234-5678','10 95678-1234',]ifuser.save():print('Usuário adicionado com sucesso!')O mesmo método é usado para atualizar o registro, basta possuir a chave de partição e os dados que precisam ser alterados.user=User()user.id='meu-id-55'user.email='john.doe@email.com'# altera o emailuser.save()# atualiza o registro para o novo emailFind By IdPara buscar um registro pela chave de partição, se usa o métodofind_by_id(). O mesmo vai retornar a instancia da model com os atributos buscados, mantendo o Active Record e possibilitando a execução de outras instruções, como o update que vimos a pouco.user=User().find_by_id('meu-id-55')user.stars=17print(f'O usuário{user.full_name}possui{user.stars}estrelas!')user.save()FindPara as demais consultas, como uma busca geral (scan) ou uma busca com filtro, o método utilizado é ofind()e os métodos subsequentes para formar umQuery Builder.# busca todos os produtosproducts=Product().find().fetch()# busca todos os usuários que estão com o status COMPLETEDcompleted_users=User().find('#st = :st',{':st':'COMPLETED'},{'#st':'status'}).fetch()# busca todos os usuários com limite de 10users=User().find().limit(10).fetch()É importante destacar que o scan possui um limite na quantidade de dados que retorna, e para trabalhar com isso basta assinalar o parâmetropaginate_through_resultscomoTrueno métodofetch().# busca todos os produtos paginando o resultado da consulta no DynamoDBproducts=Product().find().fetch(True)Find ByPara os casos de consultas com filtro em determinada propriedade que não seja uma chave de partição, pode-se usar o métodofind_by. Para verificar a contagem de itens recebidos ao realizar o fetch (após ofindoufind_by), basta usar a propriedadeget_countusers=User()online_users=users.find_by('status','online').fetch(True)print(f'{users.get_count}online no momento!')Query ByPara os casos de consultas com filtro em determinada chave de partição, pode-se usar o métodoquery_by.users=User()online_users=users.query_by('status','online').fetch(True)print(f'{users.get_count}online no momento!')OrderServe para ordenar de acordo com determinado atributo, podendo também trazer a resposta de form crescente ou decrescente, a depender do valor que for passado no segundo argumento que por padrão é True e retorna de maneira crescente.users=User()online_users=users.find_by('status','online').order('first_name').fetch(True)print(f'{users.get_count}online no momento!')CountCaso queira contar o total de itens na tabela ou operação que você fizer sem retornar os dados registrados nela, basta substituir o métodofetch()porcount()users=User()online_users=users.find_by('status','online').order('first_name').count()print(f'{online_users}online no momento!')FetchPor default retorna os dados como um dict, mas ao passar o argumento object como True ele retorna os registros como um objeto DynoLayer.users=User().find_by('status','online').order('first_name').fetch(object=True)print(users[0].name)DestroyPara remover um registro, basta obter a sua chave de partição e executar o métododestroy()em seguida.user=User().find_by_id('meu-id-55')ifuser.destroy():print('Usuário removido com sucesso!')