Paweł Łukasiewicz
2024-01-15
Paweł Łukasiewicz
2024-01-15
Udostępnij Udostępnij Kontakt
Wprowadzenie

Używając AWS SDK dla .NET możemy wykonywać typowe operacje CRUD, tj. dodawanie, odczyt, aktualizację i usuwanie elementów w tabeli. Poniżej lista kroków, które należy wykonać aby być w stanie wykonać powyższe operacje CRUD:

  • utworzenie instancji klasy AmazonDynamoDBClient;
  • przekazanie specyficznych parametrów wymaganych w odpowiednim obiekcie żądania. W przypadku dodawania elementów wykorzystamy obiekt żądania PutItemRequest a w przypadku pobierania istniejącego elementu posłużymy się obiektem GetItemRequest;
  • uruchomienie odpowiedniej metody udostępnionej przez klienta wraz z przekazaniem odpowiedniego obiektu żądania, który utworzyliśmy w poprzednim kroku. Wspomniany powyżej klient pozwala na wykonanie następująych operacji CRUD, tj. PutItem, GetItem, UpdateItem oraz DeleteItem.

Dodawanie elementów

Metoda PutItem dodaje nowy element to tabeli. Jeżeli element istnieje to dochodzi do całkowitego zastąpienia. Jeżeli jednak nie chcemy zastępować całego elementu a jedynie zaktualizować określone atrybuty należy użyć metody UpdateItem - o tym w jednym z kolejnych wpisów.

Tak jak wspomniałem we wprowadzeniu, kolejne kroki niezbędne do dodania nowego elementu do tabeli to: utworzenie instancji klasy AmazonDynamoDBClient, utworzenie instancji klasy PutItemRequest i podanie wymaganych parametrów (nazwa tabeli oraz definicja nowego elementu), wywołanie metody PutItem z przekazaniem naszego żądania jako parametru. Celem łatwiejszej interpretacji spójrzcie na poniższy przykład:

public async Task<ActionResult<string>> PutItem()
{
    var request = new PutItemRequest
    {
        TableName = TableName,
        Item = new Dictionary()
        {
            { "Id", new AttributeValue {N = "1"} },
            { "Brand", new AttributeValue {S = "Audi"} },
            { "Model", new AttributeValue{S = "RS6 C8"} },
            { "Color", new AttributeValue {S = "Nardo Gray"} },
            { "Price", new AttributeValue { S = "634 800"} },
            {
                "Engineers",
                new AttributeValue { SS = new List<string>{ "Dr. Bernhard Schirm", "Dr. Markus Weisser" } }
            }
        }
    };

    var response = await _amazonDynamoDB.PutItemAsync(request);

    return response.HttpStatusCode.ToString();
}
W powyższym przykładzie dodajemy do naszej tabeli nowy element, który ma poniższe atrybuty: Id, Brand, Model, Color, Price oraz Engineers. Jedynie identyfikator (Id) jest typem numerycznym, pozostałe atrybuty są typu String a jeden z nich (Engineers) jest zbiorem typu String.

Opcjonalne parametry

Zanim pobierzemy dodany element spojrzymy jeszcze na jedno niezwykle ważne zagadnienie jakim są opcjonalne parametry. Parametry te możemy przekazać za pomocą wykorzystanego wcześniej obiektu PutItemRequest. Opcjonalne parametry, które za chwilę wykorzytamy to ExpressionAttributeNames, ExpressionAttributeValues oraz ConditionExpression. Ich poniższe wykorzystanie określa, że dany element może zostać zastąpiony tylko wtedy, gdy istniejący element posiada atrybut Color o określonej wartości:

public async Task<ActionResult<string>> PutItemWithParameters() {

  var request = new PutItemRequest {
    TableName = TableName,
      Item = new Dictionary<string, AttributeValue> () {
        {
          "Id",
          new AttributeValue {
            N = "1"
          }
        }, {
          "Brand",
          new AttributeValue {
            S = "Audi"
          }
        }, {
          "Model",
          new AttributeValue {
            S = "RS6 C8"
          }
        }, {
          "Color",
          new AttributeValue {
            S = "Nogaro Blue"
          }
        }, {
          "Price",
          new AttributeValue {
            S = "1 064 000"
          }
        }, {
          "Engineers",
          new AttributeValue {
            SS = new List<string> {
              "Dr. Bernhard Schirm",
              "Dr. Markus Weisser"
            }
          }
        }
      },
      // Parametry opcjonalne
      ExpressionAttributeNames = new Dictionary<string, string> () {
        {
          "#C",
          "Color"
        }
      },
      ExpressionAttributeValues = new Dictionary<string, AttributeValue> () {
        {
          ":color",
          new AttributeValue {
            S = "Nardo Gray"
          }
        }
      },
      ConditionExpression = "#C = :color"
  };

  var response = await _amazonDynamoDB.PutItemAsync(request);

  return response.HttpStatusCode.ToString();
}

Wywołanie powyższego fragmentu kodu zadziała pomyślnie ponieważ obiekt o takim Id istnieje już w naszej bazie danych a dodatkowo miał zdefiniowany odpowiedni kolor. Dwie wartości, kolor i cena zostaną zaktualizowane o czym przekonamy się w kolejnym wpisie, kiedy pobierzemy odpowiednie wartości z bazy danych.