Удаление записи
Чтобы удалить с условием запись в таблице Series:
-
Создайте проект
SeriesItemOps06:mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=com.mycompany.app \ -DartifactId=SeriesItemOps06В результате выполнения команды в текущем рабочем каталоге будет создан каталог проекта с именем
SeriesItemOps06, структурой подкаталогов и файлом описания проектаpom.xml. -
Перейдите в каталог проекта:
cd SeriesItemOps06 -
Отредактируйте описание проекта в файле
pom.xml, например с помощью редактора nano:nano pom.xmlПример файла
pom.xml:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>SeriesItemOps06</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>SeriesItemOps06</name> <url>http://maven.apache.org</url> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.mycompany.app.SeriesItemOps06</mainClass> </manifest> <manifestEntries> <Class-Path>.</Class-Path> </manifestEntries> </archive> <finalName>release/SeriesItemOps06</finalName> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/release/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> <version>1.11.1012</version> </dependency> </dependencies> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project>Посмотрите актуальные версии junit
и aws-java-sdk-dynamodb . -
В каталоге
src/main/java/com/mycompany/app/создайте файлSeriesItemOps06.java, например с помощью редактора nano:nano src/main/java/com/mycompany/app/SeriesItemOps06.javaСкопируйте в созданный файл следующий код:
Важно
Вместо
<Document_API_эндпоинт>укажите подготовленное ранее значение.package com.mycompany.app; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.PrimaryKey; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.spec.DeleteItemSpec; import com.amazonaws.services.dynamodbv2.document.utils.ValueMap; public class SeriesItemOps06 { public static void main(String[] args) throws Exception { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("<Document_API_эндпоинт>", "ru-central1")) .build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Series"); int series_id = 3; String title = "Supernatural"; DeleteItemSpec deleteItemSpec = new DeleteItemSpec() .withPrimaryKey(new PrimaryKey("series_id", series_id, "title", title)).withConditionExpression("info.rating <= :val") .withValueMap(new ValueMap().withNumber(":val", 5)); try { System.out.println("Попытка удаления записи..."); table.deleteItem(deleteItemSpec); System.out.println("Данные о сериале удалены."); } catch (Exception e) { System.err.println("Невозможно удалить запись: " + series_id + " " + title); System.err.println(e.getMessage()); } } }Этот код удалит запись о фильме, если его рейтинг равен или менее 5.
Вы можете использовать метод
deleteItemдля удаления одной записи, указав ее первичный ключ. Также можно дополнительно указатьConditionExpression, чтобы предотвратить удаление элемента, если это условие не выполняется. -
Соберите проект:
mvn packageВ результате выполнения команды в каталоге
target/release/будет сгенерирован файлSeriesItemOps06.jar. -
Запустите приложение:
java -jar target/release/SeriesItemOps06.jarРезультат:
Попытка удаления записи... Невозможно удалить запись: 3 Supernatural Condition not satisfied (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: null; Proxy: null)Операция завершилась с ошибкой: рейтинг фильма больше 5.
Измените код, удалив условие в
DeleteItemSpec:DeleteItemSpec deleteItemSpec = new DeleteItemSpec() .withPrimaryKey(new PrimaryKey("series_id", series_id, "title", title));Повторите сборку проекта и запустите приложение:
mvn package && java -jar target/release/SeriesItemOps06.jarТеперь операция успешна:
Попытка удаления записи... Данные о сериале удалены.
-
Создайте файл
SeriesItemOps06.py, например с помощью редактора nano:nano SeriesItemOps06.pyСкопируйте в созданный файл следующий код:
Важно
Вместо
<Document_API_эндпоинт>укажите подготовленное ранее значение.from decimal import Decimal from pprint import pprint import boto3 from botocore.exceptions import ClientError def delete_underrated_serie(title, series_id, rating): ydb_docapi_client = boto3.resource('dynamodb', endpoint_url = "<Document_API_эндпоинт>") table = ydb_docapi_client.Table('Series') try: response = table.delete_item( Key = { 'series_id': series_id, 'title': title }, ConditionExpression = "info.rating <= :val", ExpressionAttributeValues = { ":val": Decimal(rating) } ) except ClientError as e: if e.response['Error']['Code'] == "ConditionalCheckFailedException": print(e.response['Error']['Message']) else: raise else: return response if __name__ == '__main__': print("Попытка удаления записи...") delete_response = delete_underrated_serie("Supernatural", 3, 5) if delete_response: print("Данные о сериале удалены:") pprint(delete_response, sort_dicts = False)Приведенный код удаляет запись, если рейтинг сериала меньше или равен 5.
Для удаления записи используется метод
delete_item, в котором нужно передать атрибуты первичного ключа нужной записи. При необходимости вы можете задать условие для удаления записи, указав параметрConditionExpression. -
Запустите программу:
python SeriesItemOps06.pyРезультат:
Попытка удаления записи... Condition not satisfiedОперация завершилась с ошибкой: рейтинг фильма больше 5.
-
Измените код, удалив условие:
response = table.delete_item( Key = { 'series_id': series_id, 'title': title } ) -
Запустите программу еще раз. Теперь операция удаления должна завершиться успешно.
Результат:
Попытка удаления записи... Данные о сериале удалены: {'ResponseMetadata': {'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'application/x-amz-json-1.0', 'x-amz-crc32': '2745614147', 'x-request-id': '786fed1d-3c71-4fee-9827-f3f28da0493e', 'date': 'Wed, 13 Jan 2021 11:04:13 GMT', 'content-length': '2'}, 'RetryAttempts': 0}}
-
Создайте файл
SeriesItemOps06.php, например с помощью редактора nano:nano SeriesItemOps06.phpСкопируйте в созданный файл следующий код:
Важно
Вместо
<Document_API_эндпоинт>укажите подготовленное ранее значение.<?php require 'vendor/autoload.php'; date_default_timezone_set('UTC'); use Aws\DynamoDb\Exception\DynamoDbException; use Aws\DynamoDb\Marshaler; $sdk = new Aws\Sdk([ 'endpoint' => '<Document_API_эндпоинт>', 'region' => 'ru-central1', 'version' => 'latest' ]); $dynamodb = $sdk->createDynamoDb(); $marshaler = new Marshaler(); $tableName = 'Series'; $series_id = 3; $title = 'Supernatural'; $key = $marshaler->marshalJson(' { "series_id": ' . $series_id . ', "title": "' . $title . '" } '); $eav = $marshaler->marshalJson(' { ":val": 5 } '); $params = [ 'TableName' => $tableName, 'Key' => $key, 'ConditionExpression' => 'info.rating <= :val', 'ExpressionAttributeValues'=> $eav ]; try { $result = $dynamodb->deleteItem($params); echo "Запись удалена.\n"; } catch (DynamoDbException $e) { echo "Невозможно удалить запись:\n"; echo $e->getMessage() . "\n"; } ?>Вы можете использовать метод
deleteItemдля удаления одной записи, указав ее первичный ключ. Также можно дополнительно указатьConditionExpression, чтобы предотвратить удаление элемента, если это условие не выполняется.Этот код удалит запись о фильме, если его рейтинг равен или менее 5.
-
Запустите программу:
php SeriesItemOps06.phpРезультат:
Невозможно удалить запись: ... ConditionalCheckFailedException (client): Condition not satisfied ...Операция завершилась с ошибкой: рейтинг фильма больше 5.
Измените код, удалив условие:
$params = [ 'TableName' => $tableName, 'Key' => $key ];Запустите программу еще раз. Теперь операция успешна:
Запись удалена.
-
Создайте файл
SeriesItemOps06.js, например с помощью редактора nano:nano SeriesItemOps06.jsСкопируйте в созданный файл следующий код:
Важно
Вместо
<Document_API_эндпоинт>укажите подготовленное ранее значение.const AWS = require("@aws-sdk/client-dynamodb"); const { marshall } = require("@aws-sdk/util-dynamodb"); // Credentials should be defined via environment variables AWS_SECRET_ACCESS_KEY and AWS_ACCESS_KEY_ID const dynamodb = new AWS.DynamoDBClient({ region: "ru-central1", endpoint: "<Document_API_эндпоинт>", }); const table = "Series"; const series_id = 3; const title = "Supernatural"; const params = { TableName: table, Key: marshall({ "series_id": series_id, "title": title }), ConditionExpression: "info.rating >= :val", ExpressionAttributeValues: marshall({ ":val": 10 }) }; console.log("Выполнение удаления с условием..."); dynamodb.send(new AWS.DeleteItemCommand(params)) .then(data => { console.log("Удаление выполнено:", JSON.stringify(data, null, 2)); }) .catch(err => { console.error("Не удалось удалить запись. Ошибка JSON:", JSON.stringify(err, null, 2)); process.exit(1); })Удалить одиночную запись, указав ее первичный ключ, можно с помощью команды
DeleteItemCommand. При необходимости можно указать выражениеConditionExpression, чтобы предотвратить удаление элемента, если это условие не выполняется. -
Запустите программу:
node SeriesItemOps06.jsРезультат:
Выполнение удаления с условием... Не удалось удалить запись. Ошибка JSON: { "message": "Condition not satisfied", "code": "ConditionalCheckFailedException", "time": "2021-06-14T20:33:29.115Z", "statusCode": 400, "retryable": false, "retryDelay": 20.94065998018778 }Операция завершилась с ошибкой: рейтинг фильма меньше 10.
Измените код, удалив условие:
const params = { TableName: table, Key: marshall({ "series_id": series_id, "title": title }), };Запустите программу еще раз. Теперь операция успешна:
Выполнение удаления с условием... Удаление выполнено: {}
-
Создайте файл
SeriesItemOps06.rb, например с помощью редактора nano:nano SeriesItemOps06.rbСкопируйте в созданный файл следующий код:
Важно
Вместо
<Document_API_эндпоинт>укажите подготовленное ранее значение.require 'aws-sdk-dynamodb' def table_item_deleted?(dynamodb_client, table_item) dynamodb_client.delete_item(table_item) true rescue StandardError => e puts "Ошибка удаления записи: #{e.message}" false end def run_me region = 'ru-central1' table_name = 'Series' title = 'Supernatural' series_id = 3 Aws.config.update( endpoint: '<Document_API_эндпоинт>', region: region ) dynamodb_client = Aws::DynamoDB::Client.new table_item = { table_name: table_name, key: { series_id: series_id, title: title }, condition_expression: 'info.rating > :val', expression_attribute_values: { ':val' => 9 } } puts "Удаление сериала '#{title} (#{series_id})' из таблицы '#{table_name}', при выполнении заданного условия." if table_item_deleted?(dynamodb_client, table_item) puts 'Запись удалена.' else puts 'Не удалось удалить запись.' end end run_me if $PROGRAM_NAME == __FILE__Удалить одиночную запись, указав ее первичный ключ, можно с помощью метода
delete. При необходимости можно указать выражениеConditionExpression, чтобы предотвратить удаление элемента, если это условие не выполняется. -
Запустите программу:
ruby SeriesItemOps06.rbРезультат:
Удаление сериала 'Supernatural (3)' из таблицы 'Series', при выполнении заданного условия. Ошибка удаления записи: Condition not satisfied Не удалось удалить запись.Операция завершилась с ошибкой: рейтинг фильма равен 9.
Измените код, удалив условие:
table_item = { table_name: table_name, key: { series_id: series_id, title: title } }Запустите программу еще раз. Теперь операция успешна:
Удаление сериала 'Supernatural (3)' из таблицы 'Series', при выполнении заданного условия. Запись удалена.